详解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 相关文章推荐
EXT窗口Window及对话框MessageBox
Jan 27 Javascript
JavaScript bold方法入门实例(把指定文字显示为粗体)
Oct 17 Javascript
javascript实现实时输出当前的时间
Apr 27 Javascript
js实现的早期滑动门菜单效果代码
Aug 27 Javascript
JavaScript知识点整理
Dec 09 Javascript
浅谈开发eslint规则
Oct 01 Javascript
说说Vue.js中的functional函数化组件的使用
Feb 12 Javascript
no-vnc和node.js实现web远程桌面的完整步骤
Aug 11 Javascript
node命令行工具之实现项目工程自动初始化的标准流程
Aug 12 Javascript
JS实现点餐自动选择框(案例分析)
Dec 10 Javascript
JS自定义对象创建与简单使用方法示例
Jan 15 Javascript
JS 5种遍历对象的方式
Jun 16 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
paypal即时到账php实现代码
2010/11/28 PHP
PHP+ajax分页实例简析
2015/12/07 PHP
php语言的7种基本的排序方法
2020/12/28 PHP
PHPCMS2008广告模板SQL注入漏洞修复
2016/10/11 PHP
Yii2.0多文件上传实例说明
2017/07/24 PHP
laravel邮件发送的实现代码示例
2020/01/31 PHP
Javascript中Event属性搜集整理
2013/09/17 Javascript
javascript实现json页面分页实例代码
2014/02/20 Javascript
JavaScript字符串对象substring方法入门实例(用于截取字符串)
2014/10/17 Javascript
JQuery实现样式设置、追加、移除与切换的方法
2015/06/11 Javascript
JQuery菜单效果的两个实例讲解(3)
2015/09/17 Javascript
JS组件Bootstrap导航条使用方法详解
2016/04/29 Javascript
JavaScript中对JSON对象的基本操作示例
2016/05/21 Javascript
利用node.js搭建简单web服务器的方法教程
2017/02/20 Javascript
jquery实现一个全局计时器(商城可用)
2017/06/30 jQuery
vue全局自定义指令-元素拖拽的实现代码
2019/04/14 Javascript
使用vuex解决刷新页面state数据消失的问题记录
2019/05/08 Javascript
Node.js 深度调试方法解析
2020/07/28 Javascript
下载给定网页上图片的方法
2014/02/18 Python
浅谈python中拼接路径os.path.join斜杠的问题
2018/10/23 Python
python日期相关操作实例小结
2019/06/24 Python
django admin.py 外键,反向查询的实例
2019/07/26 Python
python twilio模块实现发送手机短信功能
2019/08/02 Python
git查看、创建、删除、本地、远程分支方法详解
2020/02/18 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
2020/04/24 Python
如何在python中处理配置文件代码实例
2020/09/27 Python
iphoneX 适配客户端H5页面的方法教程
2017/12/08 HTML / CSS
英国排名第一的餐具品牌:Denby Pottery
2019/11/01 全球购物
晚会闭幕词
2015/01/28 职场文书
顶岗实习协议书
2015/01/29 职场文书
请客吃饭开场白
2015/06/01 职场文书
爸爸的三轮车观后感
2015/06/16 职场文书
青年志愿者活动感想
2015/08/07 职场文书
文明和谐家庭事迹材料(2016精选版)
2016/02/29 职场文书
2019年幼儿园管理条例范本!
2019/07/17 职场文书
CSS3 菱形拼图实现只旋转div 背景图片不旋转功能
2021/03/30 HTML / CSS