vue中向data添加新屬性的三種方式小結(jié)
向data添加新屬性的三種方式
原理分析
首先在了解這三種方式之前,我覺(jué)的有必要說(shuō)一下,為啥不能直接手動(dòng)給data中的對(duì)象添加屬性呢?
下面咱們一塊分析下:
vue2 是通過(guò)數(shù)據(jù)劫持 “Object.defineProperty” 實(shí)現(xiàn)數(shù)據(jù)響應(yīng)式;
? ? const obj = {};
? ? ? ? let val = 'kk'
? ? ? ? Object.defineProperty(obj,'name',{
? ? ? ? ? ? get(){
? ? ? ? ? ? ? ? console.log('訪問(wèn)了')
? ? ? ? ? ? ? ? return val
? ? ? ? ? ? ? ?
? ? ? ? ? ? },
? ? ? ? ? ? set(newval){
? ? ? ? ? ? ? ? if(newval !==val)
? ? ? ? ? ? ? ? val = newval;
? ? ? ? ? ? ? ? ?console.log('設(shè)置',newval)
? ? ? ? ? ? }
? ? ? ? })在我們?cè)L問(wèn)或者設(shè)置obj.name的時(shí)候,會(huì)相繼出發(fā) setter,getter;然而在給obj添加屬性的時(shí)候,卻沒(méi)有觸發(fā)屬性攔截;
其實(shí)上邊的代碼是將obj對(duì)象的name屬性設(shè)置成了響應(yīng)式數(shù)據(jù),但是新添加的屬性并沒(méi)有通過(guò)Object.defineProperty 設(shè)置成響應(yīng)式,所有這就是為什么vue 的data中對(duì)象新加屬性頁(yè)面無(wú)法更新,但是數(shù)據(jù)上卻又我們新加屬性的原因。
三種方式
1.Vue.set()
Vue.set( target, propertyName/index, value ) 參數(shù)
{Object | Array} target{string | number} propertyName/index{any} value
返回值:設(shè)置的值
通過(guò)Vue.set向響應(yīng)式對(duì)象中添加一個(gè)property,并確保這個(gè)新 property同樣是響應(yīng)式的,且觸發(fā)視圖更新
data() {
? ? return {
? ? ? ? msg:{
? ? ? ? ? ? name:'黑澤明',
? ? ? ? ? ? hero:true
? ? ? ? } ? ?
? ? }
},
methods: {
? ? addProperty(){
? ? ? ? this.$set(this.msg, 'sex', '男')
? ? }
},2.Object.assign()
直接使用Object.assign()添加到對(duì)象的新屬性不會(huì)觸發(fā)更新。
應(yīng)創(chuàng)建一個(gè)新的對(duì)象,合并原對(duì)象和混入對(duì)象的屬性
? ? data() {
? ? ? ? return {
? ? ? ? ? ? msg:{
? ? ? ? ? ? ? ? name:'黑澤明',
? ? ? ? ? ? ? ? hero:true
? ? ? ? ? ? } ? ?
? ? ? ? }
? ? },
? ?addProperty(){
? ? ? ? ? ? this.msg = Object.assign({},this.msg,{sex:'name'});
? ? ? ? },3.$forceUpdate
$forceUpdate迫使Vue 實(shí)例重新渲染
data() {
? ? return {
? ? ? ? msg:{
? ? ? ? ? ? name:'黑澤明',
? ? ? ? ? ? hero:true
? ? ? ? } ? ?
? ? }
},
addProperty(){
? ? ? ?this.msg.sex = '男';
? ? ? ?this.$forceUpdate()?
? ? },小結(jié)一下吧:
- 對(duì)象中添加少量的新屬性,可以直接采用Vue.set()
- 對(duì)象中添加多個(gè)新屬性,則通過(guò)Object.assign()創(chuàng)建新對(duì)象
- 如果你實(shí)在不知道怎么操作時(shí),可采取$forceUpdate()進(jìn)行強(qiáng)制刷新 (不建議)
vue組件 data等屬性介紹
注意:
1.組件中的data屬性的內(nèi)容,必須是一個(gè)function類型,并且必須要有返回值。用法跟實(shí)例中的data使用是一樣的,同時(shí)也有實(shí)例化對(duì)象的其他屬性如,methods
2.因?yàn)槿绻?,不是這里面的對(duì)象,而是一個(gè)公共的對(duì)象實(shí)例,可能會(huì)出現(xiàn)錯(cuò)誤。不同的組件如果改變了公共的對(duì)象然后返回,對(duì)其他組件有影響
HTML代碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../lib/vue.js"></script>
</head>
<body>
<div id="app">
<my-com></my-com>
</div>
<script>
Vue.component('myCom',{
template:'<h3>陳小帥是真的帥呢 +++ {{ msg }}</h3>',
data:function () {
return{
msg:'組件中的data內(nèi)容'
}
}
});
//組件中的data屬性的內(nèi)容,必須是一個(gè)function類型,并且必須要有返回值。用法跟實(shí)例中的data使用是一樣的,同時(shí)也有實(shí)例化對(duì)象的其他屬性如,methods
//因?yàn)槿绻?,不是這里面的對(duì)象,而是一個(gè)公共的對(duì)象實(shí)例,可能會(huì)出現(xiàn)錯(cuò)誤。不同的組件如果改變了公共的對(duì)象然后返回,對(duì)其他組件有影響
var vm = new Vue({
el:'#app',
data:{}
});
</script>
</body>
</html>效果:

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue 基于abstract 路由模式 實(shí)現(xiàn)頁(yè)面內(nèi)嵌的示例代碼
這篇文章主要介紹了vue 基于abstract 路由模式 實(shí)現(xiàn)頁(yè)面內(nèi)嵌的示例代碼,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下2020-12-12
vue?echarts實(shí)現(xiàn)航班選座案例分析
這篇文章主要介紹了vue?echarts實(shí)現(xiàn)航班選座案例分析,代碼是使用echarts來(lái)實(shí)現(xiàn)的,主要用到的是svg和自定義地圖的相關(guān)知識(shí),需要的朋友可以參考下2022-05-05
vue3響應(yīng)式實(shí)現(xiàn)readonly從零開始教程
這篇文章主要為大家介紹了vue3響應(yīng)式實(shí)現(xiàn)readonly從零開始教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
使用vue.js實(shí)現(xiàn)聯(lián)動(dòng)效果的示例代碼
本篇文章主要介紹了使用vue.js實(shí)現(xiàn)聯(lián)動(dòng)效果的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01
vue使用vue-json-viewer插件展示JSON格式數(shù)據(jù)的方法
這篇文章主要給大家介紹了關(guān)于vue使用vue-json-viewer插件展示JSON格式數(shù)據(jù)的相關(guān)資料,前端使用這個(gè)插件可以方便展現(xiàn)出json格式的數(shù)據(jù),下載引入使用代碼可直接使用,需要的朋友可以參考下2024-05-05
vue3.0項(xiàng)目小白填坑之vue3.0+vite獲取環(huán)境變量
Vue3項(xiàng)目使用vite作為打包工具時(shí),環(huán)境變量可以保存在.env文件中,在build時(shí)進(jìn)行解析,這篇文章主要給大家介紹了關(guān)于vue3.0項(xiàng)目小白填坑之vue3.0+vite獲取環(huán)境變量的相關(guān)資料,需要的朋友可以參考下2024-03-03

