为什么非React变量在Vue3中表现奇怪?

xzabzqsa  于 7个月前  发布在  Vue.js
关注(0)|答案(1)|浏览(66)

这里是代码

<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>

s71maibg

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依赖项,因此当它发生变化时,它不会触发模板更新。
希望这有助于回答您的问题。

相关问题