新建項目(不知道怎么新建項目?參考文章:vue-cli3 搭建vue項目)
目錄結構
界面顯示
添加store.js
export default {
fetch: (key) => JSON.parse(window.localStorage.getItem(key)),
save: (data, key) => window.localStorage.setItem(key, JSON.stringify(data)),
};
將兩個操作localStorage的函數export出去。
需要在使用的時候import進來。
App.vue代碼編寫
html
<template>
<div id="app">
<div class="wrap">
<input type="text" v-model="keyword" @keydown.enter="addData" />
<ul v-if="list.length">
<li
v-for="(item, index) in list"
:key="index"
@click="changeState(index)"
:class="{complete: item.state}"
>{{ item.txt }}</li>
</ul>
</div>
</div>
</template>
script
import store from "./common/store"; // 引入store模塊
const STORAGE_KEY = "my-key";
export default {
name: "app",
data() {
return {
keyword: "",
list: store.fetch(STORAGE_KEY) ? store.fetch(STORAGE_KEY) : [], // 從本地存儲中獲取數據
};
},
components: {},
mounted() {},
methods: {
// 添加數據
addData() {
this.list.push({
txt: this.keyword,
state: false,
});
this.keyword = "";
},
// 點擊后改變狀態
changeState(index) {
this.list[index].state = !this.list[index].state;
},
},
watch: {
// 這里監聽整個list數據的變化,避免每次修改數據的時候都需要進行本地存儲
list: {
handler() {
store.save(this.list, STORAGE_KEY); // 寫入本地存儲
},
deep: true, // 切換為false之后,點擊切換狀態,刷新看效果,未觸發watch。
},
},
};
css
*{margin: 0;padding: 0;}
.wrap {width: 80%;margin: 0 auto;}
input {height: 30px;width: 100%;}
li {
height: 30px;
line-height: 30px;
background: #e2e2e2;
margin: 4px 0;
cursor: pointer;
list-style-type: none;
padding: 0 10px;
}
li.complete {background: #5cce5c;color: #fff;}
