详解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 相关文章推荐
原生js的弹出层且其内的窗口居中
May 14 Javascript
JavaScript中的object转换函数toString()与valueOf()介绍
Dec 31 Javascript
jquery获取复选框的值的简单实例
May 26 Javascript
JavaScript中数组Array.sort()排序方法详解
Mar 01 Javascript
微信小程序 Buffer缓冲区的详解
Jul 06 Javascript
基于Vue制作组织架构树组件
Dec 06 Javascript
js实现以最简单的方式将数组元素添加到对象中的方法
Dec 20 Javascript
jQuery实现form表单序列化转换为json对象功能示例
May 23 jQuery
node.js使用redis储存session的方法
Sep 26 Javascript
在vue里使用codemirror遇到的问题
Nov 01 Javascript
小程序实现选择题选择效果
Nov 04 Javascript
JS组件库AlloyTouch实现图片轮播过程解析
May 29 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删除HTMl标签的实现代码
2013/06/30 PHP
php 读取文件头判断文件类型的实现代码
2013/08/05 PHP
PHP中使用file_get_contents post数据代码例子
2015/02/13 PHP
PHP编程之设置apache虚拟目录
2016/07/08 PHP
Ajax实现对静态页面的文章访问统计功能示例
2016/10/10 PHP
php curl获取到json对象并转成数组array的方法
2018/05/31 PHP
PHP chunk_split()函数讲解
2019/02/12 PHP
PHP中“=&gt;
2019/03/01 PHP
php的命名空间与自动加载实现方法
2019/08/25 PHP
判断脚本加载是否完成的方法
2009/05/26 Javascript
jquery更换文章内容与改变字体大小代码
2013/09/30 Javascript
javascript中直接引用Microsoft的COM生成Word
2014/01/20 Javascript
js+css绘制颜色动态变化的圈中圈效果
2016/01/27 Javascript
基于jQuery实现Accordion手风琴自定义插件
2020/10/13 Javascript
Node.js中用D3.js的方法示例
2017/01/16 Javascript
用Vue.extend构建消息提示组件的方法实例
2017/08/08 Javascript
小程序:授权、登录、session_key、unionId的详解
2019/05/15 Javascript
layui插件表单验证提交触发提交的例子
2019/09/09 Javascript
解决layer 动态加载select 失效的问题
2019/09/18 Javascript
JS数组方法push()、pop()用法实例分析
2020/01/18 Javascript
vue 防止页面加载时看到花括号的解决操作
2020/11/09 Javascript
[44:40]2018DOTA2亚洲邀请赛3月30日 小组赛A组Liquid VS OG
2018/03/31 DOTA
python中的sort方法使用详解
2014/07/25 Python
Selenium 模拟浏览器动态加载页面的实现方法
2018/05/16 Python
Django Rest framework三种分页方式详解
2019/07/26 Python
django项目用higcharts统计最近七天文章点击量
2019/08/17 Python
Python如何实现定时器功能
2020/05/28 Python
浅析rem和em和px vh vw和% 移动端长度单位
2016/04/28 HTML / CSS
浅析CSS3 用text-overflow解决文字排版问题
2020/10/28 HTML / CSS
学校四群教育实施方案
2014/06/12 职场文书
大专生自荐书范文
2014/06/22 职场文书
合伙开公司协议书范本
2014/10/28 职场文书
三好学生个人总结
2015/02/15 职场文书
保送生自荐信
2015/03/06 职场文书
致地震灾区的慰问信
2015/03/23 职场文书
Ajax实现局部刷新的方法实例
2021/03/31 Javascript