视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
详解vue 实例方法和数据
2020-11-27 22:27:21 责编:小采
文档


1.vm.$set

问题描述:

如何在不通过循环数据给list数据添加一个showMore属性,并且在moreFun中改变这个新增属性的值,并实现双向绑定?

<template>
 <div id="app">
 <div class="demo">
 <ul>
 <template v-for="(v,index) in list">
 <li>{{v.name}}</li>
 <div v-show="!v.showMore">
 <button @click="moreFun(index)">展示更多</button>
 </div>
 </template>
 </ul>
 </div>
 </div>
</template>
<script>
export default {
 name: 'app',
 data() {
 return {
 list: [{
 name: '小颖'
 }, {
 name: '仔仔'
 }, {
 name: '黑妞'
 }, {
 name: '土豆'
 }]
 }
 },
 methods: {
 moreFun(index) {
 console.log(this.list);
 }
 }
}
</script>
<style>
#app {
 font-family: 'Avenir', Helvetica, Arial, sans-serif;
 -webkit-font-smoothing: antialiased;
 -moz-osx-font-smoothing: grayscale;
 text-align: center;
 color: #2c3e50;
 margin-top: 60px;
}
</style>

一开始小颖并不知道怎么做,而且小颖觉得               

 <div v-show="!v.showMore">
 <button @click="moreFun(index)">展示更多</button>
 </div>

这段代码肯定会报错,然而当小颖写上后发现,并没有,后来那位帅锅告诉我,看看vue的  vm.$set     小颖看后将moreFun方法写为:

 moreFun(index) {
 this.$set(this.list[index], 'showMore', true);
 console.log(this.list);
 }

然后就达到小颖想要的结果啦。小颖当时遇到的问题类似于这样的:

<template>
 <div id="app">
 <div class="demo">
 <ul>
 <template v-for="(v,index) in list">
 <li>{{v.name}}</li>
 <div v-show="!v.showMore">
 <button @click="moreFun(index)">展示更多</button>
 </div>
 </template>
 </ul>
 </div>
 </div>
</template>
<script>
export default {
 name: 'app',
 data() {
 return {
 list: [{
 name: '小颖'
 }, {
 name: '仔仔'
 }, {
 name: '黑妞'
 }, {
 name: '土豆'
 }]
 }
 },
 mounted: function() {
 this.list.forEach(function(element, index) {
 element.showMore = false;
 });
 },
 methods: {
 moreFun(index) {
 this.list[index].showMore = true;
 console.log(this.list);
 }
 }
}
</script>
<style>
#app {
 font-family: 'Avenir', Helvetica, Arial, sans-serif;
 -webkit-font-smoothing: antialiased;
 -moz-osx-font-smoothing: grayscale;
 text-align: center;
 color: #2c3e50;
 margin-top: 60px;
}
</style>

问题:当执行完moreFun方法后,虽然list中的showMore属性的值变成了true,但是

<div v-show="!v.showMore"> <button @click="moreFun(index)">展示更多</button> </div>

按钮 展示更多  仍然显示着,这是因为,如果在实例创建之后添加新的属性到实例上,它不会触发视图更新。

所以后来小颖就将showMore直接添加到list中,然后就好啦。现在想想其实用个vm.$set就解决啦。

2.vm.$watch

用法:

观察 Vue 实例变化的一个表达式或计算属性函数。回调函数得到的参数为新值和旧值。表达式只接受监督的键路径。对于更复杂的表达式,用一个函数取代。

注意:在变异 (不是替换) 对象或数组时,旧值将与新值相同,因为它们的引用指向同一个对象/数组。Vue 不会保留变异之前值的副本。

<template>
 <div id="app">
 <div class="demo">
 <input type="text" class="num1" v-model="num1">
 <label class="sign">-</label>
 <input type="text" class="num2" v-model="num2">
 <label class="sign">=</label>
 <label class="result">{{resultNum}}</label>
 </div>
 </div>
</template>
<script>
export default {
 name: 'app',
 data() {
 return {
 num1: 1,
 num2: 5,
 resultNum: null
 }
 },
 watch: {
 num1: function() {
 var _num1 = parseInt(this.num1);
 var _num2 = parseInt(this.num2);
 this.resultNum = _num1 - _num2;
 },
 num2: function() {
 var _num1 = parseInt(this.num1);
 var _num2 = parseInt(this.num2);
 this.resultNum = _num1 - _num2;
 }
 },
 mounted: function() {
 var _num1 = parseInt(this.num1);
 var _num2 = parseInt(this.num2);
 this.resultNum = _num1 - _num2;
 }
}
</script>
<style>
#app {
 font-family: 'Avenir', Helvetica, Arial, sans-serif;
 -webkit-font-smoothing: antialiased;
 -moz-osx-font-smoothing: grayscale;
 text-align: center;
 color: #2c3e50;
 margin-top: 60px;
}
input.num1,
input.num2 {
 width: 100px;
}
label.sign {
 font-size: 30px;
 vertical-align: -3px;
}
label.result {
 font-size: 20px;
}
</style>

3.vm.$delete

 用法:

这是全局 Vue.delete 的别名。

<template>
 <div id="app">
 <div class="demo">
 <ul>
 <template v-for="(v,index) in list">
 <li>{{v.name}}</li>
 <li>{{v.age}}</li>
 <button @click="deleteFun(index)">delete</button>
 </template>
 </ul>
 </div>
 </div>
</template>
<script>
export default {
 name: 'app',
 data() {
 return {
 list: [{
 name: '小颖',
 age:22
 }, {
 name: '仔仔',
 age:1
 }, {
 name: '黑妞',
 age:1
 }, {
 name: '土豆',
 age:1
 }]
 }
 },
 methods: {
 deleteFun(index) {
 this.$delete(this.list[index], 'age');
 }
 }
}
</script>
<style>
#app {
 font-family: 'Avenir', Helvetica, Arial, sans-serif;
 -webkit-font-smoothing: antialiased;
 -moz-osx-font-smoothing: grayscale;
 text-align: center;
 color: #2c3e50;
 margin-top: 60px;
}
</style>

总结

以上所述是小编给大家介绍的vue 实例方法和数据,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

下载本文
显示全文
专题