在编写vue的时候遇到了这个警告:
Propertywas accessed during render but is not defined on instance.
是一个小问题,没有报错
总结了下面2种常见的简单解决方法:
1.原因:vue引入有问题,很多大佬都有说到这种解决方案
解决方法:在script标签中加入setup
<script setup> ... </script>
复制
2.原因:警告的 "***"未设置初始值,这也是我的问题,但没有看到大家指出。
解决方法:给该属性添加一个初始值
<script > var obj = { data(){ return{ isAll: false, //初始值 ... } } }
复制
这个小问题不会报错,代码多的情况下挺难找的。
如果是vue引入整个有问题可能会直接报错,所以如果属性警告那大概率问题在于没有设置初始值。细心一点就好。
希望对大家有帮助~
个人案例:用vue实现购物车金额计算和动态增减删除
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <link rel="stylesheet" href=""> <style> li{ display:flex; justify-content: space-around; padding: 10px; } li img{ width:100px; } </style> <script type="text/javascript" src="../lib/vue.next.js"></script> <!--!!上一行记得改成自己的vue.next.js路径!!--!> </head> <body> <!-- 功能1:勾选 功能2:计算总金额 --> <div id="box"> <input type="checkbox" v-model="isAll" @change="handleAllChecked"/>全选/全不选<!-- 绑定一个布尔值,change事件在他改变后才获取数值,正确--> <ul> <li v-for="(item,index) in datalist" :key="item.id"><!-- v-for遍历 --> <input type="checkbox" v-model="checkList" :value="item" @change="handleItemChecked"/><!-- 商品选择:双向数据绑定框 --> <img :src="item.pic"/><!-- 商品图片 --> <!-- :src动态绑定 --> <div><!-- 名称+价格 --> <div>{{item.name}}</div> <div style="color: #c03bbe;">${{item.price}}</div> </div> <div><!-- 数量 --> <button @click="item.number--" :disabled="item.number===1">-</button> <!-- 商品数量不能小于1 --> <span>{{item.number}}</span> <button @click="item.number++" :disabled="item.number===item.limit">+</button><!-- 商品数量不能大于限购数量 --> </div> <div><!-- 删除商品按钮 --> <button @click="handleDeleteClick(index,item.id)">delete</button> </div> </li> </ul> <div>总金额:${{sum()}}</div> {{checkList}} </div> <script> var obj = { data(){ return{ isAll: false, //初始值 checkList:[],//勾选的购物车数据 datalist:[{//所有的购物车数据 name:"商品1", price:10, number:1, id:1, limit:10,//限购 pic:" https://img1.baidu.com/it/u=1967065197,716971243&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1677344400&t=8a1882c11a23d159b36c8912723d67b9" }, { name:"商品2", price:12, number:2, id:2, limit:5, pic:"https://img1.baidu.com/it/u=1967065197,716971243&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1677344400&t=8a1882c11a23d159b36c8912723d67b9" }, { name:"商品3", price:45, number:3, id:3, limit:10, pic:"https://img1.baidu.com/it/u=1967065197,716971243&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1677344400&t=8a1882c11a23d159b36c8912723d67b9" }, { name:"商品4", price:17.5, number:1, id:4, limit:5, pic:"https://img1.baidu.com/it/u=1967065197,716971243&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1677344400&t=8a1882c11a23d159b36c8912723d67b9" } ] } }, methods:{ sum(){ var total = 0 //累加计算checkList数组中每一项的:价格*数量 this.checkList.forEach(item => { total+=item.price*item.number }) return total }, handleDeleteClick(index,id){ //删除datalist靠index索引 this.datalist.splice(index,1)//splice(从几号索引开始删除,删除几个) //删除checklist靠匹配id this.checkList = this.checkList.filter(item=>item.id!==id)//过滤:更新checkList,返回剩下的未被过滤掉的元素(id与被删商品id不符的) //状态同步,完善全选删除状态反馈 this.handleItemChecked() }, //比较两数组长度,长度相等为全选 handleAllChecked(){ if(this.isAll){ this.checkList = this.datalist }else{ this.checkList = [] } }, //每项选择:选中为全选,取消为全不选 handleItemChecked(){ if(this.checkList.length===this.datalist.length){ this.isAll = true }else{ this.isAll = false } } } } var vm = Vue.createApp(obj).mount("#box")//引入vue </script> </body> </html>
复制