在JS中如何同步修改vue中的變量
JS中同步修改vue中的變量
問題
在處理一個功能上遇到一個問題:在vue組件中,引入了一個JS文件,在JS文件動態(tài)創(chuàng)建了一些DOM節(jié)點(diǎn),需要偵測dom節(jié)點(diǎn)中內(nèi)容的變化同時改變vue中組件的內(nèi)容。
思考
因?yàn)樗菃为?dú)的一個JS文件,里面動態(tài)生成的dom可以通過oninput來偵測輸入內(nèi)容的變化,但要實(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ù)組和對象傳遞都是引用傳遞。賦值時傳遞的并不是值,而是指向了同一個空間。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue3?element-plus?實(shí)現(xiàn)表格數(shù)據(jù)更改功能詳細(xì)步驟
這篇文章主要介紹了vue3 element-plus實(shí)現(xiàn)表格數(shù)據(jù)更改功能,本文分步驟結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07
vue3中el-uplod結(jié)合ts實(shí)現(xiàn)圖片粘貼上傳
本文主要介紹了vue3中el-uplod結(jié)合ts實(shí)現(xiàn)圖片粘貼上傳,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07
基于vue,vue-router, vuex及addRoutes進(jìn)行權(quán)限控制問題
這篇文章主要介紹了基于vue,vue-router, vuex及addRoutes進(jìn)行權(quán)限控制問題,需要的朋友可以參考下2018-05-05
vue實(shí)現(xiàn)類似淘寶商品評價頁面星級評價及上傳多張圖片功能
最近在寫一個關(guān)于vue的商城項(xiàng)目,然后集成在移動端中,開發(fā)需求中有一界面,類似淘寶商城評價界面!接下來通過本文給大家分享vue實(shí)現(xiàn)類似淘寶商品評價頁面星級評價及上傳多張圖片功能,需要的朋友參考下吧2018-10-10
解決Vue 項(xiàng)目打包后favicon無法正常顯示的問題
今天小編就為大家分享一篇解決Vue 項(xiàng)目打包后favicon無法正常顯示的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09
vue3采用xlsx庫實(shí)現(xiàn)本地上傳excel文件功能
這篇文章主要為大家詳細(xì)介紹了vue3如何采用xlsx庫實(shí)現(xiàn)本地上傳excel文件功能,并且前端解析為Json數(shù)據(jù),感興趣的小伙伴可以了解一下2025-02-02
詳解Vue組件之間的數(shù)據(jù)通信實(shí)例
本篇文章主要介紹了詳解Vue組件之間的數(shù)據(jù)通信實(shí)例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06
Vue router的addRoute方法實(shí)現(xiàn)控制權(quán)限方法詳解
這篇文章主要介紹了vue動態(tài)路由添加,vue-router的addRoute方法實(shí)現(xiàn)權(quán)限控制流程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-09-09

