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实现坐标拾取器功能示例
Nov 18 Vue.js
vue中使用echarts的示例
Jan 03 Vue.js
如何在VUE中使用vue-awesome-swiper
Jan 04 Vue.js
vue3弹出层V3Popup实例详解
Jan 04 Vue.js
vue-quill-editor插入图片路径太长问题解决方法
Jan 08 Vue.js
Vue包大小优化的实现(从1.72M到94K)
Feb 18 Vue.js
浅谈vue2的$refs在vue3组合式API中的替代方法
Apr 18 Vue.js
详解Vue中$props、$attrs和$listeners的使用方法
Feb 18 Vue.js
VUE之图片Base64编码使用ElementUI组件上传
Apr 09 Vue.js
三种方式清除vue路由跳转router-link的历史记录
Apr 10 Vue.js
ant design vue的form表单取值方法
Jun 01 Vue.js
Vue 打包后相对路径的引用问题
Jun 05 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的日期与时间函数技巧
2008/04/24 PHP
PHP和Mysqlweb应用开发核心技术-第1部分 Php基础-2 php语言介绍
2011/07/03 PHP
php生成html文件方法总结
2014/12/01 PHP
php给一组指定关键词添加span标签的方法
2015/03/31 PHP
php模仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(中)
2017/06/11 PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
2018/05/12 PHP
laravel框架的安装与路由实例分析
2019/10/11 PHP
PHP的Trait机制原理与用法分析
2019/10/18 PHP
JS中彻底删除JSON对象组成的数组中的元素
2020/09/22 PHP
ASP中用Join和Array,可以加快字符连接速度的代码
2007/08/22 Javascript
JS处理VBArray的函数使用说明
2008/05/11 Javascript
jQuery自带的一些常用方法总结
2014/09/03 Javascript
javascript制作游戏开发碰撞检测的封装代码
2015/03/31 Javascript
高效Web开发的10个jQuery代码片段
2016/07/22 Javascript
javascript 中的事件委托详解
2016/10/25 Javascript
关于Angular2 + node接口调试的解决方案
2017/05/28 Javascript
Angular 4依赖注入学习教程之简介(一)
2017/06/04 Javascript
解析Vue.js中的组件
2018/02/02 Javascript
javascript变量提升和闭包理解
2018/03/12 Javascript
解决v-for中使用v-if或者v-bind:class失效的问题
2018/09/25 Javascript
[53:10]完美世界DOTA2联赛决赛日 FTD vs GXR 第二场 11.08
2020/11/11 DOTA
Python闭包和装饰器用法实例详解
2019/05/22 Python
基于Python获取城市近7天天气预报
2019/11/26 Python
PyTorch使用cpu加载模型运算方式
2020/01/13 Python
Python reduce函数作用及实例解析
2020/05/08 Python
Pycharm创建python文件自动添加日期作者等信息(步骤详解)
2021/02/03 Python
纯CSS3制作的简洁蓝白风格的登录模板(非IE效果更好)
2013/08/11 HTML / CSS
canvas简单连线动画的实现代码
2020/02/04 HTML / CSS
应届生财务会计求职信
2013/11/05 职场文书
纪念九一八事变演讲稿1000字
2014/09/14 职场文书
综合实践活动报告
2015/02/05 职场文书
施工员岗位职责范本
2015/04/11 职场文书
《纸船和风筝》教学反思
2016/02/18 职场文书
初中语文教学反思范文
2016/03/03 职场文书
小学二年级语文教学反思
2016/03/03 职场文书
python模块与C和C++动态库相互调用实现过程示例
2021/11/02 Python