使用 ref() 与 reactive()。为什么这个例子像在 Vue 3 Composition API 中一样工作?

Using ref() vs reactive(). Why this example works as it does in Vue 3 Composition API?

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

    <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 将值传递给 child。 但这如期而至

let formData = ref({});

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

现在 formData 是反应式的,可以将其作为 prop 传递。仔细阅读文档,如果变量数据是 object 那么我应该没问题。我确实注意到,如果我在第一个示例中将 formData 移至全局范围,那么它将是反应性的。任何人都可以解释这种行为以及为什么我必须使用 ref() 来使我的示例工作吗?谢谢

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

const formData = reactive({})

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

  // Incorrect
  formData = data 
}

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

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