详解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 相关文章推荐
php对mongodb的扩展(初识如故)
Nov 11 Javascript
ajax请求乱码的解决方法(中文乱码)
Apr 10 Javascript
jQuery简单实现禁用右键菜单
Mar 10 Javascript
javascript解决IE6下hover问题的方法
Jul 28 Javascript
Seajs是什么及sea.js 由来,特点以及优势
Oct 13 Javascript
bootstrap 模态框(modal)实现水平垂直居中显示
Jan 23 Javascript
深入理解angular2启动项目步骤
Jul 15 Javascript
javascript用rem来做响应式开发
Jan 13 Javascript
vue实现新闻展示页的步骤详解
Apr 11 Javascript
Vue v-for循环之@click点击事件获取元素示例
Nov 09 Javascript
JavaScript进制转换实现方法解析
Jan 18 Javascript
如何HttpServletRequest文件对象并储存
Aug 14 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
PHP 数组排序方法总结 推荐收藏
2010/06/30 PHP
用PHP实现递归循环每一个目录
2010/08/08 PHP
一个基于PDO的数据库操作类(新) 一个PDO事务实例
2011/07/03 PHP
THINKPHP内容分页代码分享
2015/01/14 PHP
Yii开启片段缓存的方法
2016/03/28 PHP
PHP基于phpqrcode类生成二维码的方法详解
2018/03/14 PHP
鼠标滑上去后图片放大浮出效果的js代码
2011/05/28 Javascript
JavaScript实现url地址自动检测并添加URL链接示例代码
2013/11/12 Javascript
JavaScript获取table中某一列的值的方法
2014/05/06 Javascript
el表达式 写入bootstrap表格数据页面的实例代码
2017/01/11 Javascript
nodejs入门教程一:概念与用法简介
2017/04/24 NodeJs
微信禁止下拉查看URL的处理方法
2017/09/28 Javascript
mui框架移动开发初体验详解
2017/10/11 Javascript
js+html获取系统当前时间
2017/11/10 Javascript
JS随机数产生代码分享
2018/02/24 Javascript
JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解
2018/12/12 Javascript
vue实现todolist功能、todolist组件拆分及todolist的删除功能
2019/04/11 Javascript
OpenLayers3实现鼠标移动显示坐标
2020/09/25 Javascript
Python SQLite3数据库操作类分享
2014/06/10 Python
使用python实现接口的方法
2017/07/07 Python
浅谈Django REST Framework限速
2017/12/12 Python
深入理解Django-Signals信号量
2019/02/19 Python
Python+PyQt5+MySQL实现天气管理系统
2020/06/16 Python
css3的过滤效果简单实例
2016/08/03 HTML / CSS
canvas实现滑动验证的实现示例
2020/08/11 HTML / CSS
美体小铺加拿大官方网站:The Body Shop加拿大
2016/10/30 全球购物
戴尔新加坡官网:Dell Singapore
2020/12/13 全球购物
科研课题实施方案
2014/03/18 职场文书
明信片寄语大全
2014/04/08 职场文书
安全资料员岗位职责范本
2014/06/28 职场文书
公安学专业求职信
2014/07/27 职场文书
创业计划书之韩国烧烤店
2019/09/19 职场文书
公文写作:工伤事故分析报告怎么写?
2019/11/05 职场文书
HTTP中的Content-type详解
2022/01/18 HTML / CSS
Kubernetes部署实例并配置Deployment、网络映射、副本集
2022/04/01 Servers
JS前端可视化canvas动画原理及其推导实现
2022/08/05 Javascript