在JS中如何同步修改vue中的變量
JS中同步修改vue中的變量
問題
在處理一個(gè)功能上遇到一個(gè)問題:在vue組件中,引入了一個(gè)JS文件,在JS文件動(dòng)態(tài)創(chuàng)建了一些DOM節(jié)點(diǎn),需要偵測(cè)dom節(jié)點(diǎn)中內(nèi)容的變化同時(shí)改變vue中組件的內(nèi)容。
思考
因?yàn)樗菃为?dú)的一個(gè)JS文件,里面動(dòng)態(tài)生成的dom可以通過oninput來偵測(cè)輸入內(nèi)容的變化,但要實(shí)時(shí)更新到vue組件中,那只能找他們的連接點(diǎn)或者搭橋(借助vuex、localStorage這些全局變量),想著可以利用對(duì)象類型,因?yàn)槠涫菍⒁梅旁诙阎校嬲闹荡娣旁跅V?,通過傳遞其引用作為橋梁來達(dá)到JS文件中修改vue中值的效果。
解決
通過上述方式并不利于今后維護(hù),其實(shí)我們可以巧妙利用閉包達(dá)到目的,這組件中定義需要修改的方法,通過在JS調(diào)用該該方法來達(dá)到修改vue組件變量的目的。
vue中如下:
<template> <div class="about" id="about"> {{text}} </div> </template> <script> import Test from './test' export default { name: 'About', data () { return { text: 'gg' } }, mounted () { const test = new Test( { hooks: { input: value => this.text = value } } ) } } </script>
類中方法
export default class Test { constructor(props = {}) { this.options = Object.assign({ mode: 'write' }, props) this.create() } create() { let about = document.getElementById('about') let div = document.createElement('div') div.innerHTML = '<input type="text" id="inputText">' about.appendChild(div) let input = document.getElementById('inputText') input.addEventListener('input', () => { this.options.hooks.input(input.value) }) } }
vue.js修改賦值變量問題
最近使用vue.js發(fā)現(xiàn)修改賦值的變量,原變量的數(shù)據(jù)也隨之改變了。
例子
const app = new Vue({ ?? ??? ??? ?el: '#app', ?? ??? ??? ?data: { ?? ??? ??? ??? ?list:[1,2,3], ?? ??? ??? ?}, ?? ??? ??? ?methods: { ?? ??? ??? ??? ?test() { ?? ??? ??? ??? ??? ?let temp = this.list; // 將list賦值給了temp ?? ??? ??? ??? ??? ?temp = [1,2], // temp發(fā)生改變 ?? ??? ??? ??? ??? ?console.log(temp); // 打印結(jié)果 [1,2] ?? ??? ??? ??? ??? ?console.log(this.list); // 打印結(jié)果 [1,2] ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?});
解決方案
const app = new Vue({ ?? ??? ??? ?el: '#app', ?? ??? ??? ?data: { ?? ??? ??? ??? ?list:[1,2,3], ?? ??? ??? ?}, ?? ??? ??? ?methods: { ?? ??? ??? ??? ?test() { ?? ??? ??? ??? ??? ?let temp = JSON.parse(JSON.stringify(this.list)); // 將list賦值給了temp ?? ??? ??? ??? ??? ?temp = [1,2], // temp發(fā)生改變 ?? ??? ??? ??? ??? ?console.log(temp); // 打印結(jié)果 [1,2] ?? ??? ??? ??? ??? ?console.log(this.list); // 打印結(jié)果 [1,2,3] ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?});
原因:
在vue中,數(shù)組和對(duì)象傳遞都是引用傳遞。賦值時(shí)傳遞的并不是值,而是指向了同一個(gè)空間。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
在vue-cli的組件模板里使用font-awesome的兩種方法
今天小編就為大家分享一篇在vue-cli的組件模板里使用font-awesome的兩種方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-09-09簡(jiǎn)單理解vue中實(shí)例屬性vm.$els
這篇文章主要幫助大家簡(jiǎn)單理解vue中實(shí)例屬性vm.$els,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12Vue echart實(shí)現(xiàn)柱狀圖,電池圖,3D柱圖和3D圓柱圖代碼詳解
這篇文章主要為大家介紹了Vue實(shí)現(xiàn)echart繪圖代碼詳解,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01vue3+vite引入插件unplugin-auto-import的方法
這篇文章主要介紹了vue3+vite引入插件unplugin-auto-import的相關(guān)知識(shí),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值?,需要的朋友可以參考下2022-10-10淺析Vue3中通過v-model實(shí)現(xiàn)父子組件的雙向數(shù)據(jù)綁定及利用computed簡(jiǎn)化父子組件雙向綁定
這篇文章主要介紹了淺析Vue3中通過v-model實(shí)現(xiàn)父子組件的雙向數(shù)據(jù)綁定及利用computed簡(jiǎn)化父子組件雙向綁定,需要的朋友可以參考下2022-12-12Vue中狀態(tài)管理器(vuex)詳解以及實(shí)際應(yīng)用場(chǎng)景
Vuex是一個(gè)專為Vue.js應(yīng)用程序開發(fā)的狀態(tài)管理模式,下面這篇文章主要給大家介紹了關(guān)于Vue中狀態(tài)管理器(vuex)詳解以及實(shí)際應(yīng)用場(chǎng)景的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11