引用the vue official documentation个州的话

$refs...他们不是被动的.

然而,我在模板中使用过这样的引用,它们确实是react 式的,甚至在方法、计算props 和观察者中也是如此(只要你在安装后访问它).几个第三方vue库e.g. this one还提供了使用/取决于参考react 性的功能.

有人能澄清一下官方文件所说的裁判不react 是什么意思吗?

推荐答案

您误解了在Vue框架的上下文中,什么是被动的.当然,在安装组件时,您可以在设置$refs对象后访问其值,但这并不意味着该对象是被动的.

当数据是react 性的时,这意味着对该数据值的更改将触发组件的某个部分的"react ",该部分取决于该数据的值,例如重新呈现模板、重新计算计算的变量或触发观察者.

Read through the documentation on reactivity.


下面是一个例子:

Vue.config.productionTip = false;
Vue.config.devtools = false;

new Vue({
  el: '#app',
  mounted() {
    console.log('$refs.foo in mounted', this.$refs.foo);  
  },
  watch: {
    '$refs.foo':{
      immediate: true,
      handler(value) {
        console.log('$refs.foo watcher', value);
      }
    }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  <div ref="foo"></div>
  <div v-if="$refs.foo">
    If $refs.foo was reactive, the template would update and you would see this message
  </div>
</div>

在该示例中,您可以看到$refs.foo的观察者最初记录$refs.foo的值为undefined.这是有道理的,因为watcher在安装组件之前就已经启动了,所以$refs对象的属性还没有设置.然后,在mounted钩子中,我们看到$refs.foo的值已按预期设置.

如果$refs是react 性的,那么我们将看到模板更新,因为v-if="$refs.foo"指令的计算结果将是true.我们还会看到,在设置了$refs.foo的值之后,观察者再次开火,记录下新的$refs.foo值.然而,由于$refs不是react 性的,这两种情况都不会发生.

Vue.js相关问答推荐

:deep() 带有嵌套 scss 规则的语法

v-slot: activator 中 {attrs} 参数的作用是什么?

两个div元素之间的vue2过渡

在 Vuex Store 模块中使用 Vue.js 插件

Vuetify 复选框:如何停止点击事件?

vue js 组件中的 this.$route 只返回 undefined

使用 vue-cli 遇到无法推断解析器错误

Express.js + lint 出错

自定义props类型

如何在 vuejs 中异步加载图像 src url?

VueJS 禁用特定属性的react性

Vuetify 输入自动完成错误

vuetify:以编程方式显示对话框

当 v-for 与对象的属性一起使用时,将 v-model 与复选框一起使用

Vuex:无法读取未定义的属性'$store'

更改时(change)调用函数

Bootstrap-vue:如何将数据传递给模态?

Vue.js 3 - 替换/更新react性对象而不会失go react性

升级到 vue-cli 3 后,HTML 中的空格消失了

Vuetify 离线文档