【问题标题】:Using ref() vs reactive(). Why this example works as it does in Vue 3 Composition API?使用 ref() 与 reactive()。为什么这个例子能像在 Vue 3 组合 API 中那样工作?
【发布时间】:2022-01-26 16:57:09
【问题描述】:

我很好奇,在文档中找不到解释这种行为的地方

    <script setup>
    let formData = reactive({});
    
    // Method to be called when there is an emitterUIUpdate event emitted
    // from form-modal.vue @param(data) is the form data sent from the
    // form submission via the event bus. It is in the form of an object.
    // We will then send this data back
    // down to child display-scrap component via a prop.
    const updateUI = (data) => {
      console.log("emitter for updateUI");
      formData = data;
  
    };

这里的 formData 不是响应式的,并且不能通过 prop 向下传递值给子级。 但这按预期工作

let formData = ref({});

const updateUI = (data) => {
  console.log("emitter for updateUI");
  formData.value = data;
  console.log("App FormData is", formData.value);
};

现在 formData 是响应式的,并且可以将其作为道具传递。阅读文档,如果变量数据是一个对象,那么我应该没问题。我确实注意到如果我在第一个示例中将 formData 移动到全局范围,那么它将是被动的。谁能解释这种行为以及为什么我必须使用 ref() 来使我的示例工作?谢谢。

【问题讨论】:

    标签: vuejs3 vue-composition-api


    【解决方案1】:

    您最初尝试使用reactive 不起作用,因为您只是重新分配它。改变响应式对象的正确方法是重新分配其内部值。

    const formData = reactive({})
    
    const updateUI = (data) => {
      // Correct
      Object.assign(formData, data)
    
      // Incorrect
      formData = data 
    }
    

    定义 ref({}) 本质上是 { value: reactive({}) } 并且在您的情况下它有效,因为您正在重新分配 formData 内部值。

    但是,如果您以与处理响应式相同的方式处理 ref,通过重新分配变量,结果将是相同的。

    【讨论】:

    • 感谢您的解释。现在它按预期工作。我很好奇,是否需要这样做,因为对象是通过引用存储的?
    • 这可能会帮助您更好地理解它stackoverflow.com/questions/61452458/ref-vs-reactive-in-vue-3
    • 谢谢。在阅读时,我感觉有点像阅读 JavaScript 中的 this.something。
    猜你喜欢
    • 1970-01-01
    • 2021-06-24
    • 2015-09-16
    • 1970-01-01
    • 2011-09-29
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多