这里是代码
<template>
<input type="button" value="click" @click="clickBtn"/>
<div id="reactiveDiv">{{ reactiveVariable }}</div>
<div id="noneReactiveDiv">{{ noneReactiveVariable }}</div>
</template>
<script setup lang="ts">
import { ref, nextTick } from "vue"
const reactiveVariable = ref('reactive')
let noneReactiveVariable = 'non reactive '
function clickBtn(){
reactiveVariable.value = (new Date().getTime()).toString()
noneReactiveVariable = (new Date().getTime()).toString()
nextTick(()=>{
console.log('next tick')
})
}
</script>
字符串
我有两个变量:reactiveVariable是reactive的,noneReactiveVariable不是。
我的问题是:
1.当我点击按钮时,模板中的两个变量都发生了变化。我认为不应该改变noneReactiveVariable,因为它的定义没有ref或reactive关键字。我的猜测是,reactiveVariable的值变化导致模板更新,并导致模板中的noneReactiveVariable也发生了变化。我不确定。
1.如果我像这样修改模板:
<template>
<input type="button" value="click" @click="clickBtn"/>
<div id="noneReactiveDiv">{{ noneReactiveVariable }}</div>
</template>
型
在这种情况下,当我点击按钮时,模板中的noneReactiveVariable并没有改变。现在看起来没有问题。但是我在函数clickBtn中有一个nextTick,当我点击按钮时,我可以在控制台中看到登录,这意味着UI或模板已经更新。我想如果模板更新了,为什么模板中的noneReactiveVariable没有像以前那样改变,reactiveVariable的改变导致了noneReactiveVariable的改变?
更新:我稍微修改了一下代码。现在noneReactiveVariable在另一个函数中被修改了。但是当按钮被点击时,noneReactiveVariable仍然被修改并更新到DOM。
<template>
<input type="button" value="click" @click="clickBtn"/>
<div id="reactiveDiv">{{ reactiveVariable }}</div>
<div id="noneReactiveDiv">{{ noneReactiveVariable }}</div>
</template>
<script setup lang="ts">
import { ref, nextTick, onMounted } from "vue"
const reactiveVariable = ref('reactive')
let noneReactiveVariable = 'non reactive '
onMounted(()=>{
setInterval(()=>{
noneReactiveVariable = (new Date().getTime()).toString()
},1000)
})
function clickBtn(){
reactiveVariable.value = (new Date().getTime()).toString()
nextTick(()=>{
console.log('next tick')
})
}
</script>
型
1条答案
按热度按时间s71maibg1#
所以我最近才开始使用VueJs,但据我所知,当你使用“ref”或“reactive”创建一个React变量时,Vue内部会跟踪它的依赖关系,允许它在React变量发生变化时自动更新模板。Vue的React系统足够智能,可以检测到React变量的变化并触发模板的重新渲染。
在第一段代码中,reactiveVariable和noneReactiveVariable都在模板中呈现。当reactiveVariable发生变化时,Vue会检测到这种变化并更新模板的相应部分。
在你的第二段代码中,只有noneReactiveVariable被渲染。当reactiveVariable改变时,Vue对noneReactiveVariable没有依赖,所以它不会触发模板中的noneReactiveVariable的更新。
关于你的最后一个问题,我不确定
nextTick
函数,但据我阅读文档https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick的理解。它用于等到下一个DOM更新周期才执行提供的回调。即使nextTick被调用,这并不意味着模板会立即更新。它只是确保在DOM更新后执行回调,以响应当前状态发生变化。因此,在您的情况下,console.log('next tick ')将在DOM更新后执行,但由于在第二段代码中noneReactiveVariable不是React依赖项,因此当它发生变化时,它不会触发模板更新。希望这有助于回答您的问题。