vue 數(shù)據(jù)操作相關(guān)總結(jié)
vue中有很多有關(guān)數(shù)據(jù)的操作方法,比如父子組件數(shù)據(jù)的傳遞,子組件修改父組件數(shù)據(jù),props,computed,watch,sync等,今天就來總結(jié)一下這些操作方法的使用
computed是計算屬性
computed是計算屬性:減少模板{{}}的復(fù)雜度。 在模板中放入太多的邏輯會讓模板過重且難以維護。對于任何復(fù)雜邏輯,你都應(yīng)當(dāng)使用計算屬性 把復(fù)雜的運算邏輯寫到computed的函數(shù)里面,再在模板里引用就使邏輯變得簡單明了了 使用方法: computed與data并列,將一系列操作封裝成一個方法,放到computed里,調(diào)用時直接寫方法名,不用加( )
new Vue({ el:"#app", data:{ user:{ email:"dong@qq.com", nickname:"oldUath", phone:"12812345678" } }, //計算屬性 computed:{ displayName(){ //返回一個結(jié)果 const user=this.user return user.nickname ||user.phone||user.email } }, template:` <div> {{displayName}} </div> ` })
watch偵聽器
watch:偵聽器:觀察Vue實例上的數(shù)據(jù)變動,只要指定的數(shù)據(jù)改變就會執(zhí)行預(yù)定的函數(shù) 當(dāng)需要在數(shù)據(jù)變化時執(zhí)行異步或開銷較大的操作時;
watch使用方法一:
<div id="app"> {{msg}} <br> 改變了嗎? {{isChange}} <button @click="change">改變</button> </div> new Vue({ el: "#app", data: { //這是第一層數(shù)據(jù) msg:'欲窮千里目', isChange:'No', user:{ //這是第二層數(shù)據(jù) name:"oldUath", phone:'18312345678' } }, watch:{ //只要msg改變,這個方法就會執(zhí)行,第一層數(shù)據(jù)只需要寫 數(shù)據(jù)名(){}就可以 msg(val,oldVal){ this.isChange = 'Yes' }, //第二層數(shù)據(jù)需要'','user.name'(){} 'user.name'(){ console.log('user.name變了') } }, methods:{ change(){ this.msg = '更上一層樓' } } })
注意:在vue里面如果把一個對象原封不動的再賦值給他,那么他的地址就變了
//obj:{a:'a'} obj.a+='hi'//才是監(jiān)聽obj時,因為obj地址沒有發(fā)生變化,所以不會執(zhí)行監(jiān)聽obj的事件
可以使用 deep:true這個是代表讓watch往深處監(jiān)聽,值變了就相當(dāng)于改變了
watch:{ obj(){ handle(){console.log('obj變了') }, deep:true }
使用方法二: vm.$watch('監(jiān)聽的變量',調(diào)用的函數(shù),{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})
父組件給子組件傳遞數(shù)據(jù): Props
父組件要想給子組件傳入數(shù)據(jù),需要在子組件種使用Props引入變量
父組件要給子組件出入 money="100"
先在父組件種傳入
//在父組件調(diào)用子組件 <Child :money="100"><Child>
再在子組件種引入數(shù)據(jù),引入money這個變量
<template> <div class="red"> + {{money}}元 <button>花錢</button> </div> </template> <script> export default { + props:['money'] } </script>
此時子組件只能使用父組件的數(shù)據(jù),而不能修改
子組件修改父組件的數(shù)據(jù)(.sync原理)
組件不能直接修改props外部的數(shù)據(jù)
使用$emit進行修改
在子組件使用 $emit(‘參數(shù)1',參數(shù)2)
當(dāng)前實例繼承了eventBus,可以觸發(fā)一個事件
在子組件寫$emit,第一個參數(shù)是事件名,第二個參數(shù)是修改后的值
<!-- $emit()觸發(fā)一個事件,update:money是事件名 --> <button @click="$emit('update:money',money-10)">花錢</button>
在父組件使用 $event接受參數(shù)2;
$event就是接收子組件參數(shù)2返回的結(jié)果的
<!-- 傳給子組件一個money值,v-on是監(jiān)聽子組件的update:money事件, $event獲取子組件事件的結(jié)果--> <Child :money="total" v-on:update:money="total = $event" />
簡化結(jié)果: sync
父組件這一大段代碼太麻煩了,vue把它封裝成了一個修飾符
<Child :money.sync="total" />
子組件還是那樣寫
這個只解決了父子組件的通信問題,兄弟組件的通信問題呢?
兄弟組件通信:emit/emit/on
這種方法通過一個空的Vue實例作為中央事件總線(事件中心),用它來觸發(fā)事件和監(jiān)聽事件,巧妙而輕量地實現(xiàn)了任何組件間的通信,包括父子、兄弟、跨級。當(dāng)我們的項目比較大時,可以選擇更好的狀態(tài)管理解決方案vuex。 具體實現(xiàn)方式
var Event=new Vue(); Event.$emit(事件名,數(shù)據(jù));//傳遞事件數(shù)據(jù) Event.$on(事件名,data => {});//接受數(shù)據(jù)
舉個例子:A組件向C組件傳遞信息,ABC是相鄰組件
首先在A組件提供事件數(shù)據(jù)使用$emit,第一個參數(shù)是數(shù)據(jù)名,要與接收數(shù)據(jù)的on的第一個參數(shù)相同;第二個參數(shù)是數(shù)據(jù)
<template id="a"> <div> <h3>A組件:{{name}}</h3> <button @click="send">將數(shù)據(jù)發(fā)送給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組件接受數(shù)據(jù) $on,第一個參數(shù)是數(shù)據(jù)名,第二個參數(shù)用來接收數(shù)據(jù)
<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() {//在模板編譯完成后執(zhí)行 Event.$on('data-a',name => { this.name = name;//箭頭函數(shù)內(nèi)部不會產(chǎn)生新的this,這邊如果不用=>,this指代Event }) } } </script>
總結(jié)
- 父子之間傳遞數(shù)據(jù)用
props
和$emit
- 兄弟之間傳遞數(shù)據(jù)用
$emit
和$on
- 父組件向?qū)O子組件傳遞數(shù)據(jù)使用
provide
和inject
以上就是vue 數(shù)據(jù)操作相關(guān)總結(jié)的詳細內(nèi)容,更多關(guān)于vue 數(shù)據(jù)操作的資料請關(guān)注腳本之家其它相關(guān)文章!
- vue 數(shù)據(jù)遍歷篩選 過濾 排序的應(yīng)用操作
- vuex中遇到的坑,vuex數(shù)據(jù)改變,組件中頁面不渲染操作
- vue實現(xiàn)兩個組件之間數(shù)據(jù)共享和修改操作
- VUE前端從后臺請求過來的數(shù)據(jù)進行轉(zhuǎn)換數(shù)據(jù)結(jié)構(gòu)操作
- Vue+Element ui 根據(jù)后臺返回數(shù)據(jù)設(shè)置動態(tài)表頭操作
- Vue.js使用axios動態(tài)獲取response里的data數(shù)據(jù)操作
- vue 需求 data中的數(shù)據(jù)之間的調(diào)用操作
- vue 添加和編輯用同一個表單,el-form表單提交后清空表單數(shù)據(jù)操作
- 解決vuex數(shù)據(jù)頁面刷新后初始化操作
- Vue生命周期activated之返回上一頁不重新請求數(shù)據(jù)操作
相關(guān)文章
解決vue中使用swiper插件問題及swiper在vue中的用法
Swiper是純javascript打造的滑動特效插件,面向手機、平板電腦等移動終端。這篇文章主要介紹了解決vue中使用swiper插件及swiper在vue中的用法,需要的朋友可以參考下2018-04-04vue3子組件如何修改父組件傳過來的props數(shù)據(jù)
周所周知vue的props是單向數(shù)據(jù)流,可以從父組件中改變傳往子組件的props,反之則不行,下面這篇文章主要給大家介紹了關(guān)于vue3子組件如何修改父組件傳過來的props數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2022-10-10詳解vue-cli腳手架build目錄中的dev-server.js配置文件
這篇文章主要介紹了詳解vue-cli腳手架build目錄中的dev-server.js配置文件,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11vue中封裝axios并實現(xiàn)api接口的統(tǒng)一管理
這篇文章主要介紹了vue中封裝axios并實現(xiàn)api接口的統(tǒng)一管理的方法,幫助大家更好的理解和使用vue,感興趣的朋友可以了解下2020-12-12解決Vue+Electron下Vuex的Dispatch沒有效果問題
這篇文章主要介紹了Vue+Electron下Vuex的Dispatch沒有效果的解決方案 ,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-05-05