在JS中如何同步修改vue中的變量
JS中同步修改vue中的變量
問題
在處理一個(gè)功能上遇到一個(gè)問題:在vue組件中,引入了一個(gè)JS文件,在JS文件動(dòng)態(tài)創(chuàng)建了一些DOM節(jié)點(diǎn),需要偵測dom節(jié)點(diǎn)中內(nèi)容的變化同時(shí)改變vue中組件的內(nèi)容。
思考
因?yàn)樗菃为?dú)的一個(gè)JS文件,里面動(dòng)態(tài)生成的dom可以通過oninput來偵測輸入內(nèi)容的變化,但要實(shí)時(shí)更新到vue組件中,那只能找他們的連接點(diǎn)或者搭橋(借助vuex、localStorage這些全局變量),想著可以利用對象類型,因?yàn)槠涫菍⒁梅旁诙阎?,真正的值存放在棧中,通過傳遞其引用作為橋梁來達(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ù)組和對象傳遞都是引用傳遞。賦值時(shí)傳遞的并不是值,而是指向了同一個(gè)空間。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
在vue-cli的組件模板里使用font-awesome的兩種方法
今天小編就為大家分享一篇在vue-cli的組件模板里使用font-awesome的兩種方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09
Vue echart實(shí)現(xiàn)柱狀圖,電池圖,3D柱圖和3D圓柱圖代碼詳解
這篇文章主要為大家介紹了Vue實(shí)現(xiàn)echart繪圖代碼詳解,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01
vue3+vite引入插件unplugin-auto-import的方法
這篇文章主要介紹了vue3+vite引入插件unplugin-auto-import的相關(guān)知識,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值?,需要的朋友可以參考下2022-10-10
淺析Vue3中通過v-model實(shí)現(xiàn)父子組件的雙向數(shù)據(jù)綁定及利用computed簡化父子組件雙向綁定
這篇文章主要介紹了淺析Vue3中通過v-model實(shí)現(xiàn)父子組件的雙向數(shù)據(jù)綁定及利用computed簡化父子組件雙向綁定,需要的朋友可以參考下2022-12-12
Vue中狀態(tài)管理器(vuex)詳解以及實(shí)際應(yīng)用場景
Vuex是一個(gè)專為Vue.js應(yīng)用程序開發(fā)的狀態(tài)管理模式,下面這篇文章主要給大家介紹了關(guān)于Vue中狀態(tài)管理器(vuex)詳解以及實(shí)際應(yīng)用場景的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11

