使用 localStorage 后如何在 Vue 3 中重新渲染元素?

How do you re-render an element in Vue 3 after using localStorage?

Vue 3 中,基于计算属性的元素在使用 localStorage 后似乎不会重新呈现。

为了演示这一点,我们将创建一个包含两个复选框和文本输入字段的简单表单。选中两个复选框后,输入字段应变为只读。

<div id="app">
  <form>
    <label>
      Checkbox A
      <input type="checkbox" v-model="checkboxA" />
    </label>

    <label>
      Checkbox B
      <input type="checkbox" v-model="checkboxB" />
    </label>

    <input type="text" value="abcd" :readonly="isTextBoxReadOnly" />
  </form>
</div>

两个复选框绑定到数据属性,readonly 属性绑定到计算的 属性。

const app = Vue.createApp({
    data() {
        return {
            checkboxA: false,
            checkboxB: false,
        }
    },
    computed: {
        isTextBoxReadOnly() {
            return ( this.checkboxA && this.checkboxB );
        },
    },
    mounted() {
        if (localStorage.checkboxA) {
            this.checkboxA = localStorage.checkboxA;
        }
        if (localStorage.checkboxB) {
            this.checkboxB = localStorage.checkboxB;
        }
    },
    watch: {
        checkboxA(newCheckboxA) {
            localStorage.checkboxA = newCheckboxA;
        },
        checkboxB(newCheckboxB) {
            localStorage.checkboxB = newCheckboxB;
        }
    }
})

注释掉 mounted()watch: 部分,Vue 3 表现完美。但是,启用 localStorage 后,文本输入似乎无法与计算的 属性 相匹配。要看到这个,运行 代码,选中两个框并取消选中它们;复选框值保存到 localStorage。然后刷新页面,虽然复选框已适当更新,但文本输入(基于计算的 属性)没有;即使两个复选框都未选中,文本输入(错误地)是只读的。

我认为这种行为可能是因为 localStorage 不是反应性的。这种情况下的文本输入如何正确呈现?

这里的问题是 localStorage 将值存储为字符串 "true""false",您需要在检索它们时将它们转换回布尔值,因为作为字符串,"true""false" 是真实的:

mounted() {
    if (localStorage.checkboxA) {
        this.checkboxA = localStorage.checkboxA === 'true';
    }
    if (localStorage.checkboxB) {
        this.checkboxB = localStorage.checkboxB === 'true';
    }
}