這篇文章主要為大家展示了“怎么使用Vuex實(shí)現(xiàn)一個(gè)筆記應(yīng)用”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“怎么使用Vuex實(shí)現(xiàn)一個(gè)筆記應(yīng)用”這篇文章吧。
創(chuàng)新互聯(lián)建站服務(wù)項(xiàng)目包括團(tuán)風(fēng)網(wǎng)站建設(shè)、團(tuán)風(fēng)網(wǎng)站制作、團(tuán)風(fēng)網(wǎng)頁制作以及團(tuán)風(fēng)網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,團(tuán)風(fēng)網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到團(tuán)風(fēng)省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!預(yù)期目標(biāo)
筆記具備如下基本功能
1.新增
2.刪除
3.收藏
4.在全部筆記和收藏筆記間切換
5.在當(dāng)前列表中進(jìn)行搜索
賣家秀
買家秀
準(zhǔn)備工作
1.新建項(xiàng)目
選個(gè)文件夾存放項(xiàng)目,這里我用的是 Git Bush 執(zhí)行語句($ 符號(hào)是 Git Bush 中自帶的),你也可以使用命令行,一樣的
選擇項(xiàng)目存放位置
2.查看模塊(愛看不看)
查看一下全局安裝的模塊 npm list --depth=0 -global
查看全局安裝的模塊
3.創(chuàng)建項(xiàng)目
在命令行輸入 vue init webpack vuex-note 并做好設(shè)置,創(chuàng)建一個(gè)項(xiàng)目
這都什么鬼
4.簡單解釋一下各個(gè)配置都是干嘛的
vue init webpack vuex-note:初始化(init)一個(gè)使用 webpack 構(gòu)建工具構(gòu)建的 vue 項(xiàng)目,項(xiàng)目名為 vuex-note
Project name:項(xiàng)目名
Project description:項(xiàng)目描述
Author:朕
Vue build:構(gòu)建方式,分為獨(dú)立構(gòu)建和運(yùn)行時(shí)構(gòu)建,具體說明見如下鏈接,這里選擇獨(dú)立構(gòu)建 standalone https://vuejs.org/v2/guide/installation.html#Runtime-Compiler-vs-Runtime-only
Install vue-router:是否需要安裝 vue-router ,跳轉(zhuǎn)頁面用的,這里用不著,我過會(huì)學(xué)
Use ESLint to lint your code:ESLint 規(guī)范與法用的,可能你熟悉的寫法都是不標(biāo)準(zhǔn)的,如果采用 ESLint 則可能報(bào)錯(cuò),這里選擇 n
剩下的都是測試用的,一路 n
Should we run 'npm install' for you after the project has been created:是否需要直接替你安裝(npm install)相關(guān)的依賴,回車就行,之后會(huì)替你安裝各種玩意
5.安裝完后會(huì)有提示,我們接著按照提示走
先是 cd vuex-note 進(jìn)入剛剛創(chuàng)建的 vue 項(xiàng)目文件夾
安裝完成
再通過 npm run dev 跑起項(xiàng)目
后續(xù)操作
6.訪問頁面
此時(shí)通過瀏覽器訪問 localhost:8080 就可以打開一個(gè)新的 vue 頁面
嶄新的 vue 頁面
7.項(xiàng)目結(jié)構(gòu)
截止目前的項(xiàng)目結(jié)構(gòu)如圖
項(xiàng)目結(jié)構(gòu)
由于是初學(xué),為了先搞個(gè)東西出來,所以暫時(shí)先不管一些亂七八糟的配置,只挑跟這次相關(guān)的說(其實(shí)多了我也沒學(xué)到...)
8.查看 Vuex
既然是使用 Vuex 來實(shí)現(xiàn)筆記應(yīng)用,我們就應(yīng)該先查看一下構(gòu)建的項(xiàng)目是否包含 Vuex 模塊。
node_modules 文件夾包含了現(xiàn)有的模塊,然而里面并沒有我們想要的 Vuex,不信自己去看
package.json 文件描述了項(xiàng)目包含的文件,項(xiàng)目如何運(yùn)行等信息
package.json
9.安裝 Vuex
在命令行中輸入 npm install vuex --save:--save 就是將安裝信息寫入 package.json
已安裝了 Vuex
至此,所有前期工作已經(jīng)準(zhǔn)備完成,遺漏的部分將在實(shí)現(xiàn)過程中逐一解釋
搞起
零、思路
整個(gè)應(yīng)用可拆分為三個(gè)組件
拆
每條筆記包括 編號(hào)(ID),標(biāo)題(title),內(nèi)容(content),是否已收藏(fav) 四種信息
Vuex 中的 state 得有個(gè)地方存放 所有的筆記(notes)
而 收藏,刪除 操作只能對(duì) 當(dāng)前的筆記 進(jìn)行操作,因此我還需要一個(gè)標(biāo)識(shí)用來記錄 當(dāng)前的筆記(activeNote) 是哪個(gè)
包含 全部 和 收藏 兩種切換方式,因此還需要有一個(gè)標(biāo)識(shí)來進(jìn)行區(qū)分,就叫 show 吧,all 代表 全部,fav 就代表 已收藏
組件 ==> actions.js ==> mutations.js = > state:通過組件調(diào)用 actions 中的方法(dispatch),通過 actions 中的方法調(diào)用 mutations 中的方法(commit),通過 mutations 中的方法去操作 state 中的筆記列表(notes),當(dāng)前筆記(activeNote)等等
一、index.html
vuex-note
這個(gè)沒什么說的,注意 div 的 ID 就行
二、main.js
import Vue from 'vue' import App from './App' import store from './store' Vue.config.productionTip = false new Vue({ el: '#app', store, components: { App }, template: '' })
1.在 import 時(shí)什么時(shí)候需要 ' ./ '?
從項(xiàng)目模塊中導(dǎo)出,引入時(shí)不需要 ./,而從自己寫的組件中引入時(shí)需要 ./
2.什么時(shí)候需要 import {aaa} from abc 這種加大括號(hào)的引入?什么時(shí)候不需要?
當(dāng) abc 中被導(dǎo)出的部分是 export aaa 時(shí)
當(dāng) import 的是被 export default 導(dǎo)出的部分時(shí)不加 {},并且可以起個(gè)別名
3.項(xiàng)目結(jié)構(gòu)中并沒有 store 文件,只有 store 文件夾,那 import store from './store' 是什么意思?
不知道,求指教
4. new Vue 中單獨(dú)的 store 是什么意思?
ES6 的一種簡寫方式,縮寫之前是 store:store,這句話的意思是為全局注入 Vuex,這樣在各個(gè)組件中都可以通過 this.$store 去調(diào)用狀態(tài)庫,如果不在全局注入,則需要在每個(gè)組件中單獨(dú)引入,多了會(huì)很麻煩
三、store 下的 index.js
import Vue from 'vue' import Vuex from 'vuex' import getters from './getters' import mutations from './mutations' import actions from './actions' Vue.use(Vuex) const defaultNote = { id: +new Date(), title: '新建筆記' + new Date().getMilliseconds(), // 加時(shí)間是為了做一下區(qū)分 content: '筆記內(nèi)容', fav: false } // 可以理解為一個(gè)狀態(tài)的倉庫 const state = { notes: [defaultNote], // 以數(shù)組方式存放所有的筆記 activeNote: defaultNote, // 用來記錄當(dāng)前筆記 show: 'all' // 用于切換 全部 / 已收藏 兩種不同列表的標(biāo)識(shí) } export default new Vuex.Store({ state, getters, mutations, actions })
1. Vue.use(Vuex) 是什么意思?
使用 Vuex,今后用 Vue-router 時(shí)也得來這么一出,只是得寫在 route 文件夾下的 index.js 文件中
2. +new Date() 是什么意思?
獲取時(shí)間戳的另一種寫法,等同于 new Date().getTime()
3.state,getters,mutations,actions 之間的關(guān)系?
state:如上所言狀態(tài)倉庫
getters:state 的修飾,比如 state 中有 str:"abc" 這么個(gè)屬性,而在很多組件中需要進(jìn)行 str + "def" 的操作,如果在每個(gè)組件都進(jìn)行 str + "def" 的操作未免太麻煩,于是可以在 getters 中增加:
strAdd(){ return this.str + "abc" }
今后在組件中使用 strAdd 就可以了
mutations:簡單講就是用來修改 state 的,同步方法.常規(guī)調(diào)用 this.$store.commit
actions:簡單講用來調(diào)用 mutations 的,異步方法.常規(guī)調(diào)用 this.$store.dispatch
四、tool.vue
1.mapState, mapGetter, mapActions 都是什么?
這里有個(gè)非常好的解釋 http://www.imooc.com/article/14741
此外,當(dāng) methods 和 Vuex 的 actions 中具有同名的屬性 A 時(shí),可使用 mapActions(['A']) 這種方式簡寫
注意:1、中括號(hào)不能省略;2、中括號(hào)內(nèi)是字符串;3、展開運(yùn)算符...不能省略
也可以取個(gè)別名,寫法如下,注意 [] 變成了 {}:
...map({ 本組件的屬性 : Vuex 中 actions 中的屬性 })
需要傳入?yún)?shù)時(shí),前提是 actions 中的屬性(方法)能接收參數(shù):
methods:{ ...mapActions(['abc']) // 自定義一個(gè)方法,通過觸發(fā)這個(gè)方法調(diào)用之前重名的方法并傳入?yún)?shù) tragger_abc(參數(shù)){ this.abc(參數(shù)) } }
2.scoped
對(duì)當(dāng)前組件生效的 CSS
3.calc
使用時(shí)記得在運(yùn)算符前后各加一個(gè)空格
五、list.vue
{{note.title}}
{{note.content}}
1.data 中的 search 是干嘛的?可不可以寫在 computed 中?
用來與搜索框進(jìn)行關(guān)聯(lián)。可以寫在 computed 中,但 computed 中的屬性默認(rèn)都是 getter ,就是只能獲取值,如果想修改,需要設(shè)置 setter ,詳見官方文檔
六、edit.vue
七、actions.js
export default { add_note({commit}) { commit('ADD_NOTE') }, select_note({commit}, note) { commit("SELECT_NOTE", note) }, del_note({commit}) { commit("DEL_NOTE") }, fav_note({commit}) { commit("FAV_NOTE") }, switch_note({commit}, type) { commit("SWITCH_NOTE", type) } }
1.這是干什么?
這里的每個(gè)方法實(shí)際上是通過 commit 調(diào)用 mutations.js 中的方法;
舉個(gè)栗子:tool.vue 的 新增 按鈕上綁了一個(gè) add_note 自定義方法,在 actions.js 中也定義一個(gè)同名的方法,這樣就可以在 tool.vue 中的 mapActions 中簡寫,就是下面這句:
# tool.vue ...mapActions(['add_note','del_note','fav_note'])
而 actions.js 中的 add_note 去調(diào)用 mutations.js 中寫好的 ADD_NOTE 方法,而實(shí)際的添加操作也是在 ADD_NOTE 中,組件也好,actions 也好,最終只是調(diào)用 ADD_NOTE 。之所以這么做是因?yàn)?mutations 中的方法都是同步的,而 actions 中的方法是異步的,不過在本例里沒啥區(qū)別
八、getters.js
export default { filteredNote: (state) => { if(state.show === 'all') { return state.notes } else { return state.notes.filter((note) => { if(note.fav === true) { return note } }) } } }
實(shí)現(xiàn)一個(gè)過濾,根據(jù) show 來判斷展示 全部筆記 還是 已收藏筆記
九、mutations.js
import { SWITCH_NOTE, ADD_NOTE, SELECT_NOTE, DEL_NOTE, FAV_NOTE } from './mutation-types' export default { [ADD_NOTE](state, note = { id: +new Date(), title: '新建筆記' + new Date().getMilliseconds(), content: '筆記內(nèi)容', fav: false }) { state.notes.push(note) state.activeNote = note }, [SELECT_NOTE](state, note) { state.activeNote = note }, [DEL_NOTE](state) { for(let i = 0; i < state.notes.length; i++) { if(state.notes[i].id === state.activeNote.id) { state.notes.splice(i, 1) state.activeNote = state.notes[i] || state.notes[i - 1] || {} return } } }, [FAV_NOTE](state) { state.activeNote.fav = !state.activeNote.fav }, [SWITCH_NOTE](state, type) { state.show = type } }
1.export default 那里看著好熟悉
ES6 函數(shù)的一種寫法,中括號(hào) + 常量 作為函數(shù)名,這里常量從其它文件引入
十、mutation-types.js
export const ADD_NOTE = "ADD_NOTE" export const SELECT_NOTE = "SELECT_NOTE" export const DEL_NOTE = "DEL_NOTE" export const FAV_NOTE = "FAV_NOTE" export const SWITCH_NOTE = "SWITCH_NOTE"
拋出常量,mutations.js 中的函數(shù)常量就是這里拋出的,查資料說是這么做便于一目了然都有那些方法。
以上是“怎么使用Vuex實(shí)現(xiàn)一個(gè)筆記應(yīng)用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。