详解vue 实例方法和数据


Posted in Javascript onOctober 23, 2017

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 实例方法和数据,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Javascript 兼容firefox的一些问题
May 21 Javascript
JS判断字符串变量是否含有某个字串的实现方法
Jun 03 Javascript
JS遍历ul下的li点击弹出li的索引的实现方法
Sep 19 Javascript
详解VUE 定义全局变量的几种实现方式
Jun 01 Javascript
Bootstrap 3多级下拉菜单实例
Nov 23 Javascript
js实现购物车功能
Jun 12 Javascript
微信小程序实现省市区三级地址选择
Jun 21 Javascript
一起写一个即插即用的Vue Loading插件实现
Oct 31 Javascript
js表达式与运算符简单操作示例
Feb 15 Javascript
微信小程序getLocation 需要在app.json中声明permission字段
Mar 03 Javascript
vue+elementUI中表格高亮或字体颜色改变操作
Nov 02 Javascript
js不常见操作运算符总结
Nov 20 Javascript
深入浅析javascript继承体系
Oct 23 #Javascript
Vue.js组件通信的几种姿势
Oct 23 #Javascript
Vue2.0+ElementUI实现表格翻页的实例
Oct 23 #Javascript
JavaScript之创意时钟项目(实例讲解)
Oct 23 #Javascript
浅谈js的解析顺序 作用域 严格模式
Oct 23 #Javascript
基于Vue2.0+ElementUI实现表格翻页功能
Oct 23 #Javascript
React操作真实DOM实现动态吸底部的示例
Oct 23 #Javascript
You might like
Linux下手动编译安装PHP扩展的例子分享
2014/07/15 PHP
php通过sort()函数给数组排序的方法
2015/03/18 PHP
smarty模板引擎基础知识入门
2015/03/30 PHP
PHP实现小偷程序实例
2016/10/31 PHP
JS中彻底删除JSON对象组成的数组中的元素
2020/09/22 PHP
让焦点自动跳转
2006/07/01 Javascript
Javascript的一种模块模式
2010/09/08 Javascript
JS 按钮点击触发(兼容IE、火狐)
2013/08/07 Javascript
解析URI与URL之间的区别与联系
2013/11/22 Javascript
JavaScript通过select动态更换图片的方法
2015/03/23 Javascript
jquery获取节点名称
2015/04/26 Javascript
js实现iPhone界面风格的单选框和复选框按钮实例
2015/08/18 Javascript
js点击按钮实现带遮罩层的弹出视频效果
2015/12/19 Javascript
基于jQuery实现选取月份插件附源码下载
2015/12/28 Javascript
javascript深拷贝(deepClone)详解
2016/08/24 Javascript
基于vue实现分页效果
2017/11/06 Javascript
Vim快速合并行及vim 将文件所有行合并到一行
2017/11/27 Javascript
OkHttp踩坑随笔为何 response.body().string() 只能调用一次
2018/01/08 Javascript
详解基于Vue,Nginx的前后端不分离部署教程
2018/12/04 Javascript
layui table数据修改的回显方法
2019/09/04 Javascript
微信提示 在浏览器打开 效果实现过程解析
2019/09/10 Javascript
JavaScript变量Dom对象的所有属性
2020/04/30 Javascript
Python的Django框架中settings文件的部署建议
2015/05/30 Python
python轻松查到删除自己的微信好友
2016/01/10 Python
详解Python nose单元测试框架的安装与使用
2017/12/20 Python
Python matplotlib通过plt.scatter画空心圆标记出特定的点方法
2018/12/13 Python
python多线程同步实例教程
2019/08/11 Python
Python openpyxl读取单元格字体颜色过程解析
2019/09/03 Python
adidas菲律宾官网:adidas PH
2020/02/07 全球购物
在校生汽车维修实习自我鉴定
2013/09/19 职场文书
酒店司机岗位职责
2013/12/14 职场文书
拆迁委托协议书
2014/09/15 职场文书
党员教师四风问题整改措施思想汇报
2014/10/08 职场文书
2014公司年终工作总结
2014/12/19 职场文书
解决Nginx 配置 proxy_pass 后 返回404问题
2021/03/31 Servers
前端框架ECharts dataset对数据可视化的高级管理
2022/12/24 Javascript