为什么本地存储正在更改任务列表中的每个条目

Why local storage is changing every entry in task list

本地存储应该只保存按下完成按钮的任务的状态。当前,当我刷新页面时,所有任务都标记为已完成。

<template>
<button type="button" v-bind:class="order_button_style" @click="on_order_button_click()">
  {{ buttonText }}
</button>
</div>
</template>

<script>
export default {

props: 'itemId', required: true,
data() {
    return {
        index: 'this.itemId',
        status: ''
    }
},
methods: {
on_order_button_click() {
  this.status = !this.status;
  localStorage.setItem('index', this.status);
}

},
mounted() {

this.status = localStorage.getItem('index') === "true";
},
computed: {
buttonText() {
  return this.status === true ? "Completed" : "Complete";
},
 order_button_style() {
  return this.status === true
    ? "btn btn-danger"
    : "btn btn-primary";
}

}

};
</script>

在调用设置 localstorage 时,您使用字符串 'index' 键设置项目,而不是组件的索引数据 属性。使用您现在拥有的,所有组件都从同一个本地存储密钥读取。

例如,更改:

mounted() {
    this.status = localStorage.getItem('index') === "true";
},

收件人:

mounted() {
    this.status = localStorage.getItem(this.index) === "true";
},

此外,我认为您将数据 属性 设置为等于传递的 属性 的方式行不通。我以前从没见过。我认为您只是将索引数据 属性 设置为等于字符串文字 'this.itemId'.

我重写了您的组件,试图清除我认为存在的错误。让我知道这是否有效。

<template>
    <button type="button" v-bind:class="order_button_style" @click="on_order_button_click()">
        {{ buttonText }}
    </button>
</template>

<script>
export default {
    props: {
        itemId: {
            type: String,
            required: true,
        }
    },
    data() {
        return {
            status: false,
        }
    },
    methods: {
        on_order_button_click() {
            this.status = !this.status;
            localStorage.setItem(this.itemId, this.status);
        }
    },
    mounted() {
        this.status = localStorage.getItem(this.itemId) === "true";
    },
    computed: {
        buttonText() {
            return this.status === true ? "Completed" : "Complete";
        },
        order_button_style() {
            return this.status === true ?
                "btn btn-danger" :
                "btn btn-primary";
        }

    }

};
</script>