vue 数据操作相关总结


Posted in Vue.js onDecember 17, 2020

vue中有很多有关数据的操作方法,比如父子组件数据的传递,子组件修改父组件数据,props,computed,watch,sync等,今天就来总结一下这些操作方法的使用

computed是计算属性

computed是计算属性:减少模板{{}}的复杂度。 在模板中放入太多的逻辑会让模板过重且难以维护。对于任何复杂逻辑,你都应当使用计算属性 把复杂的运算逻辑写到computed的函数里面,再在模板里引用就使逻辑变得简单明了了 使用方法: computed与data并列,将一系列操作封装成一个方法,放到computed里,调用时直接写方法名,不用加( )

new Vue({
 el:"#app",
 data:{
  user:{
   email:"dong@qq.com",
   nickname:"oldUath",
   phone:"12812345678"
  }
 },
 //计算属性
 computed:{
  displayName(){
    //返回一个结果
   const user=this.user
   return user.nickname ||user.phone||user.email
  }
 },
 template:`
   <div>
   {{displayName}}
   </div>
 `
})

watch侦听器

watch:侦听器:观察Vue实例上的数据变动,只要指定的数据改变就会执行预定的函数 当需要在数据变化时执行异步或开销较大的操作时;

watch使用方法一:

<div id="app">
    {{msg}} 
    <br> 
    改变了吗? {{isChange}}
    <button @click="change">改变</button>
  </div>
  new Vue({
   el: "#app",
   data: {
   		//这是第一层数据
      msg:'欲穷千里目',
     	isChange:'No',
      user:{
      	//这是第二层数据
        name:"oldUath",
        phone:'18312345678'
      }
   },
   watch:{
    //只要msg改变,这个方法就会执行,第一层数据只需要写 数据名(){}就可以
    msg(val,oldVal){
      this.isChange = 'Yes'
    },
    //第二层数据需要'','user.name'(){}
    'user.name'(){
    	console.log('user.name变了')
    }
   },
   methods:{
    change(){
      this.msg = '更上一层楼'
    }
   }
  })

注意:在vue里面如果把一个对象原封不动的再赋值给他,那么他的地址就变了

//obj:{a:'a'}
obj.a+='hi'//才是监听obj时,因为obj地址没有发生变化,所以不会执行监听obj的事件

可以使用 deep:true这个是代表让watch往深处监听,值变了就相当于改变了

watch:{
	obj(){
  		handle(){console.log('obj变了')
  	},
  	 deep:true
}

使用方法二: vm.$watch('监听的变量',调用的函数,{immediate:true})

与方法一的效果相同

const vm = new Vue({
   el: "#app",
   data: {
      msg:'欲穷千里目',
     	isChange:'No',
      user:{
        name:"oldUath",
        phone:'18312345678'
      }
   },
   methods:{
    change(){
      this.msg = '更上一层楼'
    }
   }
  })
  vm.$watch('msg',function(){
  		console.log('n变了')
  },{immediate:true})

父组件给子组件传递数据: Props

父组件要想给子组件传入数据,需要在子组件种使用Props引入变量

父组件要给子组件出入 money="100"
先在父组件种传入

//在父组件调用子组件
<Child :money="100"><Child>

再在子组件种引入数据,引入money这个变量

<template>
<div class="red">
+  {{money}}元
 <button>花钱</button>
</div>
</template>
<script>
export default {
+ props:['money']
}
</script>

此时子组件只能使用父组件的数据,而不能修改

子组件修改父组件的数据(.sync原理)

组件不能直接修改props外部的数据

使用$emit进行修改

在子组件使用 $emit(‘参数1',参数2)

当前实例继承了eventBus,可以触发一个事件

在子组件写$emit,第一个参数是事件名,第二个参数是修改后的值

<!-- $emit()触发一个事件,update:money是事件名  -->
<button @click="$emit('update:money',money-10)">花钱</button>

在父组件使用 $event接受参数2;

$event就是接收子组件参数2返回的结果的

<!--  传给子组件一个money值,v-on是监听子组件的update:money事件,
      $event获取子组件事件的结果-->
  <Child :money="total" v-on:update:money="total = $event" />

简化结果: sync

父组件这一大段代码太麻烦了,vue把它封装成了一个修饰符

<Child :money.sync="total" />

子组件还是那样写

这个只解决了父子组件的通信问题,兄弟组件的通信问题呢?

兄弟组件通信:emit/emit/on

这种方法通过一个空的Vue实例作为中央事件总线(事件中心),用它来触发事件和监听事件,巧妙而轻量地实现了任何组件间的通信,包括父子、兄弟、跨级。当我们的项目比较大时,可以选择更好的状态管理解决方案vuex。 具体实现方式

var Event=new Vue();
  Event.$emit(事件名,数据);//传递事件数据
  Event.$on(事件名,data => {});//接受数据

举个例子:A组件向C组件传递信息,ABC是相邻组件

首先在A组件提供事件数据使用$emit,第一个参数是数据名,要与接收数据的on的第一个参数相同;第二个参数是数据

<template id="a">
 <div>
  <h3>A组件:{{name}}</h3>
  <button @click="send">将数据发送给C组件</button>
 </div>
</template>

<script>
var Event = new Vue();//定义一个空的Vue实例
var A = {
  template: '#a',
  data() {
   return {
    name: 'tom'
   }
  },
  methods: {
   send() {
    Event.$emit('data-a', this.name);
   }
  }
}
</script>

在C组件接受数据 $on,第一个参数是数据名,第二个参数用来接收数据

<template id="c">
 <div>
  <h3>C组件:{{name}},{{age}}</h3>
 </div>
</template>
<script>

var Event = new Vue();//定义一个空的Vue实例
var C = {
  template: '#c',
  data() {
   return {
    name: '',
    age: ""
   }
  },
  mounted() {//在模板编译完成后执行
   Event.$on('data-a',name => {
     this.name = name;//箭头函数内部不会产生新的this,这边如果不用=>,this指代Event
   })
  }
}
</script>

总结

  • 父子之间传递数据用 props$emit
  • 兄弟之间传递数据用 $emit$on
  • 父组件向孙子组件传递数据使用 provideinject

以上就是vue 数据操作相关总结的详细内容,更多关于vue 数据操作的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
vue 实现基础组件的自动化全局注册
Dec 25 Vue.js
vue+element table表格实现动态列筛选的示例代码
Jan 14 Vue.js
vue实现简易计算器功能
Jan 20 Vue.js
如何在vue 中使用柱状图 并自修改配置
Jan 21 Vue.js
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
Jan 22 Vue.js
vue仿携程轮播图效果(滑动轮播,下方高度自适应)
Feb 11 Vue.js
vue3.0 项目搭建和使用流程
Mar 04 Vue.js
Vue全家桶入门基础教程
May 14 Vue.js
一篇文章告诉你如何实现Vue前端分页和后端分页
Feb 18 Vue.js
vue cli4中mockjs在dev环境和build环境的配置详情
Apr 06 Vue.js
vue实现可以快进后退的跑马灯组件
Apr 08 Vue.js
vue router 动态路由清除方式
May 25 Vue.js
Vue 组件注册全解析
Dec 17 #Vue.js
vue图片裁剪插件vue-cropper使用方法详解
Dec 16 #Vue.js
vue实现图片裁剪后上传
Dec 16 #Vue.js
Vue-router中hash模式与history模式的区别详解
Dec 15 #Vue.js
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
Dec 15 #Vue.js
Vue解决移动端弹窗滚动穿透问题
Dec 15 #Vue.js
8个非常实用的Vue自定义指令
Dec 15 #Vue.js
You might like
php+iframe实现隐藏无刷新上传文件
2012/02/10 PHP
使用PHPCMS搭建wap手机网站
2015/09/20 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
2020/05/12 PHP
HR vs ForZe BO3 第二场 2.13
2021/03/10 DOTA
初窥JQuery-Jquery简介 入门了解篇
2010/11/25 Javascript
解析Javascript中大括号“{}”的多义性
2013/12/02 Javascript
jQuery基于json与cookie实现购物车的方法
2016/04/15 Javascript
Bootstrap轮播插件中图片变形的终极解决方案 使用jqthumb.js
2016/07/10 Javascript
JavaScript学习小结之使用canvas画“哆啦A梦”时钟
2016/07/24 Javascript
js获取上传文件的绝对路径实现方法
2016/08/02 Javascript
Vue.js每天必学之Class与样式绑定
2016/09/05 Javascript
Angularjs 动态改变title标题(兼容ios)
2016/12/29 Javascript
详解js前端代码异常监控
2017/01/11 Javascript
JavaScript html5利用FileReader实现上传功能
2020/03/27 Javascript
微信小程序页面跳转功能之从列表的item项跳转到下一个页面的方法
2017/11/27 Javascript
vuejs实现标签选项卡动态更改css样式的方法
2018/05/31 Javascript
深入浅析Vue中的Prop
2018/06/10 Javascript
vue-cli中vue本地实现跨域调试接口
2019/01/16 Javascript
浅谈Vue页面级缓存解决方案feb-alive(上)
2019/04/14 Javascript
Vue实现简易计算器
2020/02/25 Javascript
Vue项目页面跳转时浏览器窗口上方显示进度条功能
2020/03/26 Javascript
微信小程序使用GoEasy实现websocket实时通讯
2020/05/19 Javascript
Node.js API详解之 assert模块用法实例分析
2020/05/26 Javascript
[00:50]2014DOTA2国际邀请赛 NEWBEE战队回顾
2014/08/01 DOTA
python检测远程服务器tcp端口的方法
2015/03/14 Python
深入Python函数编程的一些特性
2015/04/13 Python
使用Python写CUDA程序的方法
2017/03/27 Python
python实现连续图文识别
2018/12/18 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
2019/06/18 Python
使用pyshp包进行shapefile文件修改的例子
2019/12/06 Python
解决Python pip 自动更新升级失败的问题
2020/02/21 Python
Python正则表达式如何匹配中文
2020/05/27 Python
澳大利亚首个在线预订旅游网站:Wotif
2017/07/19 全球购物
打架检讨书400字
2014/01/17 职场文书
房地产项目建议书
2014/03/12 职场文书
最感人的道歉情书
2015/05/12 职场文书