Vue-Cloudnotes教程.md

  • 需求分析
  • 前后端接口約定
  • 創(chuàng)建遠(yuǎn)程倉庫
  • vue-cli初始化項目結(jié)構(gòu)
  • 初始化樣式
  • 引入圖標(biāo)
  • 安裝less
  • 配置路由
  • 組件拆分
  • 劃分模塊,編寫靜態(tài)頁面
  • 引入axios,封裝接口api
  • mock數(shù)據(jù)氓癌,測試接口api
  • 再次分析交互的實現(xiàn)細(xì)節(jié)
  • 交互實現(xiàn)
  • 打包上線

交互分析

  • 當(dāng)用戶訪問任意頁面舌稀,假如用戶未登錄,跳轉(zhuǎn)到登錄頁面
  • 用戶此時可輸入賬號密碼進(jìn)行登錄,也可點擊注冊賬號顯示【注冊頁面】
  • 在注冊頁面用戶可輸入賬號密碼進(jìn)行登錄
  • 登錄成功后尚困,跳轉(zhuǎn)到【筆記本列表】頁面,用戶可以添加贝奇,刪除芝此、修改筆記本
  • 用戶點擊某條筆記本,會跳轉(zhuǎn)到【筆記頁面】寿酌,【筆記】頁面展示【當(dāng)前筆記本下】的筆記列表胰苏,【筆記詳情組件】展示筆記列表下的第一條筆記詳情;如果筆記列表為空醇疼,【詳情組件】提示請新建硕并。
  • 用戶可切換筆記本,當(dāng)切換后秧荆,【詳情組件】默認(rèn)展示第一條筆記

2.前后端接口約定

3.新建git倉庫

4. Vue-cli建立項目結(jié)構(gòu)

vue init webpack Vue-cloudnotes

5.項目代碼初始化

1.在src/assets/styles目錄下添加reset.css文件
2.在main.js里面引入reset.css

項目代碼初始化.png

在main.js引入reset.png

6. 引入圖標(biāo)倔毙,初始化body

@import '//at.alicdn.com/t/font_496303_kqrjhri8l25d0a4i.css';
* {
  box-sizing: border-box;
}

html, body, #app {
  height: 100%;
}

body {
   font-family: 'Avenir', Helvetica, Arial, sans-serif;
  font-size: 14px;
   -webkit-font-smoothing: antialiased;
   -moz-osx-font-smoothing: grayscale;  
  background-color: #eee;
}

7.配置路由

在router-index.js里面配置路由

export default new Router({
  routes: [
    {
      path: '/',
      component: Login
    }, {
      path: '/login',
      name: 'Login',
      component: Login
    }, {
      path: '/notebooks',
      name: 'Notebooks',
      component: Notebooks
    }, {
      path: '/notes',
      name: 'Notes',
      component: Notes
    }, {
      path: '/trash',
      name: 'Trash',
      component: Trash
    }
  ]
})

組件拆分及注入

組件拆分.png
引入avatar組件1.png
引入avatar組件.png
使用avatar3.png

書寫靜態(tài)頁面

使用?傳參,再次配置路由

交互實現(xiàn)

在MVVM中乙濒,交互實現(xiàn)主要就是對數(shù)據(jù)的操作陕赃,我們對各部分需要用的的數(shù)據(jù)進(jìn)行分析卵蛉。

側(cè)邊欄
data:{username,slug}
用戶頭像
data:{slug}
sulg隨著用戶的改變而改變,初次進(jìn)入為未登錄么库,登錄或注冊后傻丝,用戶發(fā)生改變;【slug】也要進(jìn)行改變诉儒;
筆記本列表頁
data:{notebooks}
每個用戶狀態(tài)下只有一個notebooks葡缰,隨著用戶改變而改變;
筆記頁
data:{notebooks,curnotebook,notes,curnote}
notebooks通過getter獲取忱反,
curnotebook可以在筆記本列表點擊導(dǎo)航改變泛释;也可以在筆記側(cè)邊欄改變,依賴curbookId;
當(dāng)用戶改變notebook缭受,notes隨之改變
curnote,當(dāng)用戶在側(cè)邊欄點擊可改變胁澳,未點擊狀態(tài)下為當(dāng)前所有筆記中的第一個;點擊后傳入【curNoteId】改變米者;

使用Vuex管理數(shù)據(jù)

1.安裝vuex
npm i vue-x --save
2.在src目錄下新建store文件夾

vuex項目結(jié)構(gòu).png

3.在index中韭畸,引入相關(guān)模塊

import Vue from 'vue'
import Vuex from 'vuex'
import note from './modules/notebook'
import notebook from './modules/note'
import user from './modules/user'
import trash from './modules/trash'

Vue.use(Vuex)

export default new Vuex.Store({
  modules: {
    notebook,
    note,
    user,
    trash
  }
})

4.在main.js中引入并使用Store;

import store from ''./store"

new Vue({
  el: '#app',
  router,
  store,
  components: { App },
  template: '<App/>'
})

user.js

const state = {
    user:null
}
const getters = {
  sulg: state=>state.user?state.user.username.charAt(0):'未'

}
const mutations = {
  setUser(state,payload){
    state.user = payload
  }
}
const actions = {
checkoutLogin({commit}){
  return Auth.getInfo().then(res=>{
if(res.isLogin){
   commit('setUser',res.data)
    route.push('/notebooks')
  }else{
     route.push('/login')
  }
   
  })
},
  // 當(dāng)login時改變user
  loginUser({commit},{username,password}) {
    return Auth.login({username,password}).then(res=>{
        commit('setUser',res.data);
        route.push('/notebooks')
    })
  },
  registerUser({commit},{username,password}) {
    return Auth.login({username,password}).then(res=>{
      commit('setUser',res.data);
      route.push('/notebooks')
      })
  }
}

export default {
state,
getters,
mutations,
actions
}

notebooks

import Notebook from '@/apis/notebooks'
import {Message} from 'element-ui'

const state = {
  notebooks:  [],
  curBookId: null,
}
const getters = {
  notebooks: state=>state.notebooks,
  curBook: state=> {
    if(!state.curBookId) return state.notebooks[0] || {};
    return state.notebooks.find(notebook=>notebook.id==state.curBookId);
  }
}
const mutations = {
  setNotebooks(state,{notebooks}){
    state.notebooks = notebooks
  },
  addNotebook(state,{notebook}){
    state.notebooks.unshift(notebook)
  },
  deleteNotebook(state,{notebookId}){
    state.notebooks = state.notebooks.filter(notebook=>notebook.id !==notebookId)
  },
  updateNotebook(state,{notebookId,title}){
    // 淺拷貝
    let notebook = state.notebooks.find(notebook=>notebook.id===notebookId);
    notebook.title = title;
  },
  setCurBookId(state,{notebookId}) {
    console.log(notebookId)
    state.curBookId = notebookId
  }
}
const actions = {
  getNotebooks({commit}){
    return Notebook.getAll().then(res=>{
      commit('setNotebooks',{notebooks:res.data});
    })
  },
  addNotebook({commit},{title}){
    return Notebook.addNotebook({title}).then(res=>{
      commit('addNotebook',{notebook:res.data})
    })
  },
  deleteNotebook({commit},{notebookId}){
    return Notebook.deleteNotebook(notebookId).then(res=>{
      commit('deleteNotebook',{notebookId})
      Message.success(res.msg)
    }).catch(res=>{
      Message.warning(res.msg)
    })
  },
  updateNotebook({commit},{notebookId,title}){
    return Notebook.updateNotebook(notebookId,{title}).then(res=>{
      commit('updateNotebook',{notebookId,title})
    })
  }

}

export default {
  state,
  getters,
  mutations,
  actions
}

notes

import Note from '@/apis/notes'
import {Message} from 'element-ui'
window.Note = Note;
const state = {
  notes: null,
  curNoteId:null
}
const getters = {
  notes: state=>state.notes || [],
  curNote: state=> {
    if(!Array.isArray(state.notes)) return {};
    // 假如沒有傳遞參數(shù),就獲取第一個筆記
    if(!state.curNoteId) return state.notes[0] || {};
    return state.notes.find(note=>note.id==state.curNoteId) || {};
  }
}
const mutations = {
  setNotes(state,{notes}){
    state.notes = notes
  },
  setCurNoteId(state, { curnoteId }) {
    state.curNoteId = curnoteId;
  },
  addNotes(state,{note}){
    note.friendlyTime = '剛剛',
    note.updateFriendlyTime = '剛剛'
    state.notes.unshift(note)
  },
  deleteNote(state,{noteId}){

    state.notes = state.notes.filter(note=>note.id !==noteId) || {}
  },
  updateNote(state,{noteId,title,content}){
    // 淺拷貝
    let note = state.notes.find(note=>note.id===noteId);
    note.title = title;
    note.content = content;
  },

}
const actions = {
  getNotes({commit},{notebookId}){
    return Note.getAll({notebookId}).then(res=>{
      commit('setNotes',{notes:res.data});

    })
  },
  addNote({commit},{notebookId,title,content}){
    return new Promise((resolve,reject)=>{
      Note.addNote({notebookId},{title,content}).then(res=>{
        commit('addNotes',{note:res.data})
        Message.success('請在此處添加筆記內(nèi)容')
        resolve(res.data)
      })
    })
  },
  deleteNote({commit},{noteId}){
    return Note.deleteNote({noteId}).then(res=>{
      commit('deleteNote',{noteId})
      Message.success(res.msg)
    }).catch(res=>{
      Message.warning(res.msg)
    })
  },
  updateNote({commit},{noteId,title,content}){
    return Note.updateNote({noteId,title,content}).then(res=>{
      commit('updateNote',{noteId,title,value})
    }).catch(()=>{})
  }

}

export default {
  state,
  getters,
  mutations,
  actions
}

trash
xxx

具體交互

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蔓搞,一起剝皮案震驚了整個濱河市胰丁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌喂分,老刑警劉巖锦庸,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蒲祈,居然都是意外死亡甘萧,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門梆掸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扬卷,“玉大人,你說我怎么就攤上這事酸钦」值茫” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵卑硫,是天一觀的道長徒恋。 經(jīng)常有香客問我,道長欢伏,這世上最難降的妖魔是什么入挣? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮硝拧,結(jié)果婚禮上径筏,老公的妹妹穿的比我還像新娘风皿。我一直安慰自己,他們只是感情好匠璧,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咸这,像睡著了一般夷恍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上媳维,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天酿雪,我揣著相機與錄音,去河邊找鬼侄刽。 笑死指黎,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的州丹。 我是一名探鬼主播醋安,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼墓毒!你這毒婦竟也來了吓揪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤所计,失蹤者是張志新(化名)和其女友劉穎柠辞,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體主胧,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡叭首,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了踪栋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片焙格。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖己英,靈堂內(nèi)的尸體忽然破棺而出间螟,到底是詐尸還是另有隱情,我是刑警寧澤损肛,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布厢破,位于F島的核電站,受9級特大地震影響治拿,放射性物質(zhì)發(fā)生泄漏摩泪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一劫谅、第九天 我趴在偏房一處隱蔽的房頂上張望见坑。 院中可真熱鬧嚷掠,春花似錦、人聲如沸荞驴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熊楼。三九已至霹娄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鲫骗,已是汗流浹背犬耻。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留执泰,地道東北人枕磁。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像术吝,于是被迫代替她去往敵國和親计济。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,182評論 25 707
  • 用兩張圖告訴你顿苇,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料峭咒? 從這篇文章中你...
    hw1212閱讀 12,732評論 2 59
  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,982評論 3 119
  • 八秒鐘愛情 “如果你只能擁有八秒的愛情你會做什么纪岁?” “我會選擇做一條魚凑队,在前七秒完成相識、相知幔翰、相戀漩氨、相忘。就在...
    阿格雷先生閱讀 517評論 0 1
  • 美國為了控制中國的崛起遗增,厲害了的特朗普對中國芯片實行精準(zhǔn)制裁,傾刻中國的第二互聯(lián)網(wǎng)制造中興廠家全面休克叫惊,但出乎意外...
    Wangyifang閱讀 311評論 0 0