亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

Vue2.0 框架配置:vue-cli + vue-router + vuex

2024-04-27 15:12:09
字體:
來源:轉載
供稿:網友

寫于 2017-2-7

Vue中文站:cn.vuejs.org vue-router官方教程:router.vuejs.org/zh-cn vuex官方教程:vuex.vuejs.org/zh-cn

完整干凈Demo地址:coding.net/u/java_luo/p/Vue_Demo/git


1. 開始

安裝vue-cli 官方腳手架搭建工具

①、直接全局安裝 cnpm install vue-cli -g

②、然后打開npm命令行工具,cd到你想要的某個目錄中,并輸入: vue init webpack PRojectname (即開始創建名為projectname的腳手架,官方提供了webpack-simple和webpack兩種)

③、會引導你創建最基本的腳手架:

這里寫圖片描述

這樣基本項目結構就創建好了:

項目基本結構

只需要關心src目錄中的內容就好:

assets: 存放圖片、音頻等一切靜態資源 components: 存放所有的vue組件 router: 里面只有一個路由配置文件

其他地方的文件包括: babel轉碼器配置; webpack 開發模式和最終打包的生產模式所需配置; eslint代碼檢查器配置; (ESLint中文網:eslint.cn) 建議自己到eslint照著文檔配一套適合自己的語法檢測。


2. 引入vuex 狀態管理系統

cnpm install vuex –save

在項目的src文件夾下新建一個文件夾:store 在其中新建幾個基本文件:

store目錄

actions.js – vuex核心之一 getters.js – 一個方便的工具級接口,可以方便的構建全局state自定義方法 index.js – 最終所有的部分都匯聚到此,這就是store對象 mutations.js – 改變store中各個數據的唯一方法 rootState.js – 這是我自己弄的,只是把store中的各個數據都保存在這里,方便查看,不然全都放到上面的index.js,那文件里面有點亂

注:官方一些例子中,還有modules,即模塊,用于分擔store的壓力,因為項目大了之后,數據多,狀態多,所以把store分成多個module,每個module都有自己的actions,getters,mutations等,最終在index.js中全部合并。但目前我不想這么做。

我自己創建了個rootState.js保存所有的頂層數據。你也可以按照官方的例子做。


3. 配置store

src/store/index.js:

import Vue from 'vue';import Vuex from 'vuex';import * as actions from './actions';import * as mutations from './mutations';import * as getters from './getters';import state from './rootState';Vue.use(Vuex)const store = new Vuex.Store({ state, getters, actions, mutations})export default store;以上是vue官方的大致寫法,照葫蘆畫瓢即可。如果你沒有在getters中寫任何東西,那就不要引入getters

4. 查看src/main.js

需要把store加載到此文件中

main.js 原本是這樣的:

import Vue from 'vue'import App from './App'import router from './router'/* eslint-disable no-new */new Vue({ el: '#app', router, template: '<App/>', components: { App }})

現在改成這樣:

import Vue from 'vue';import App from './App';import router from './router';import store from './store';/* eslint-disable no-new */new Vue({ el: '#app', store, router, template: '<App/>', components: { App }})

這樣就算是把store掛載到vue上了


5. 一個例子

寫一個簡單的例子,把路由、vuex這一圈路程走一遍

①、在src/components中新建Test.vue

Test.vue:

<template> <div> <span>{{ msg }}</span> <!-- 我們稍后在store上定義一個msg屬性 --> <button @click='fun'>獲取數據</button> </div></template><script>import Vue from 'vue';import { mapGetters, mapActions } from 'vuex';export default { name: 'test', methods: { ...mapActions([ // 從store上綁定的action中載入需要的到此組件中 'fun', // 我們稍后在src/store/actions.js中創建一個名為fun的方法 ]), }, computed: { ...mapGetters([ // 從store上綁定的getters中載入需要的到此組件中 'msg' // 我們稍后在src/store/getters.js中創建一個名為msg的方法 ]), }}</script>這個例子的用意是:①、用戶點擊button,觸發綁定在click上的fun方法②、fun是定義在actions.js中的,這個方法會調用vue自帶的commit方法③、commit方法會自動調用mutations中對應的方法④、在mutations中更新store上的數據msg,從而Test.vue中的msg自動得到更新

②、在src/router/index.js中加入Test組件的路由:

import Vue from 'vue';import Router from 'vue-router';import Hello from 'components/Hello';import Test from 'components/Test'; // 引入Test組件Vue.use(Router)export default new Router({ routes: [ { path: '/', name: 'Hello', component: Hello }, { path: '/test', // 定義Test組件的訪問路徑 name: 'Test', // 命個名,沒有太大作用 component: Test // 指向真正的Test組件 } ]})

③、在rootState.js中定義一個msg屬性:

const state = { msg: '', // 初始值為空}export default state;

④、actions.js中的fun方法:

import reqwest from 'reqwest';// reqwest,一個封裝了promise的異步請求插件// 需要cnpm install reqwest --saveexport const fun = ({ commit }) => { reqwest({ url: `url地址`, method: 'post', contentType: 'application/json', crossOrigin: true, data: 參數, dataType: 'json', }).then(msg => { commit({ type:'getMsg', // 這個type很重要,vue會自動去找mutations.js中名為getMsg的方法 msg, // 成功后把得到的數據通過commit傳入mutations }); })};由于暫時沒有服務,Demo中用了setTimeout模擬異步請求

⑤、mutations.js中的getMsg方法

export const getMsg = (state, payload) => { state.msg = payload.msg;}只是簡單的把最新得到的msg賦給state上的msg屬性

⑥、運行項目

cnpm install cnpm run dev

會自動打開瀏覽器,進入localhost:8080/#

在瀏覽器地址欄輸入:localhost:8080/#/test 進入我們的測試頁面

點擊按鈕,可以看到數據的變化

測試用例


6. 項目最終打包發布

①、到src/config/index.js中改一個參數: 這里寫圖片描述

把這個改為false,不然在最終打包的文件中會出現一些map文件 map文件的作用在于:項目打包后,代碼都是經過壓縮加密的,如果運行時報錯,輸出的錯誤信息無法準確得知是哪里的代碼報錯。有了map就可以像未加密的代碼一樣,準確的輸出是哪一行哪一列有錯。

②、運行 cnpm run build 開始打包

③、會在項目目錄下自動創建dist目錄,打包好的文件都在其中: 這里寫圖片描述

把這些文件甩給后臺開發人員就行了


Vue 相比 React,我認為更加靈活,但碎片知識也很多。 Vue的ui庫,我用了一下elementUI庫,還行吧,但有些地方設計得沒法用,比如Table組件,我如果要動態構建字段該怎么辦。還有如果要用Table組件,就必須引入 import { Table, TableColumn } from ‘element-ui’; 然后 Vue.use(Table); Vue.use(TableColumn);

這太弱智了… Vue本身有些設計我也覺得些許坑爹。 不過Vue好在有完整的中文文檔,中文教程。相比React的中文官網好很多。 比起React,Vue可以在嵌套組件中直接訪問store,尤其有了getter這個設計,太方便了。


細節1

favicon.ico 的 問題

把favicon.ico放在項目的根目錄下(不是src中,是最外面) 然后在build/webpack.dev.conf.js中找到:

new HtmlWebpackPlugin({ filename: config.build.index, template: 'index.html', favicon: 'favicon.ico', // 在此處添加一行這個,用于webpack生成index.html時,自動把favicon.ico加入HTML中 inject: true, minify: { removeComments: true, collapseWhitespace: true, removeAttributeQuotes: true chunksSortMode: 'dependency' }),

同理,在build/webpack.prod.conf.js中也這么干。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲色无码播放| 久久人人爽人人| 亚洲欧洲日本专区| 国产精品久久久久久五月尺| 红桃视频成人在线观看| 欧美亚洲视频一区二区| 国产成人精品视频在线观看| 黑人巨大精品欧美一区二区一视频| 日韩精品免费在线播放| 成人激情免费在线| 久久91亚洲人成电影网站| 久久久久久网站| 日韩免费观看在线观看| 亚洲视频视频在线| 久久久久这里只有精品| 国产精品久久久久国产a级| 国产亚洲美女精品久久久| 亚洲男人第一网站| 欧美在线一级va免费观看| 在线免费看av不卡| 国产成人精品一区二区| 久久成年人视频| 亚洲人成电影网站| 岛国视频午夜一区免费在线观看| 亚洲网站在线观看| 一区二区在线视频播放| 日韩精品免费综合视频在线播放| 另类专区欧美制服同性| 91中文字幕一区| 在线观看精品自拍私拍| 久久福利视频网| 亚洲视频专区在线| 亚洲精品之草原avav久久| 777精品视频| 欧美亚洲国产另类| 久久视频在线看| 国产精品视频久| 国产美女搞久久| 日韩国产高清污视频在线观看| 欧美另类在线观看| 欧美丝袜一区二区三区| 日韩欧美国产视频| 欧美日韩另类在线| 国产精品久久久久久久久久久久| 国产精品h片在线播放| 91精品久久久久久久久久久久久久| 亚洲成年网站在线观看| 亚洲日本aⅴ片在线观看香蕉| 久久综合亚洲社区| 国产在线一区二区三区| 精品久久香蕉国产线看观看亚洲| 色妞欧美日韩在线| 色偷偷偷综合中文字幕;dd| 亚洲人a成www在线影院| 亚洲欧美综合区自拍另类| 欧美一区二区三区艳史| 国产精品福利在线| 国产一区二区三区丝袜| 亚洲第一男人天堂| 欧美丰满少妇xxxxx| 国产亚洲精品激情久久| 国内久久久精品| 成人免费xxxxx在线观看| 日韩a**中文字幕| 国产精品一区二区三区免费视频| 一区二区三区日韩在线| 国产精品免费一区二区三区都可以| xxxx欧美18另类的高清| 欧美成人午夜激情在线| 色综合久久中文字幕综合网小说| 欧美精品videofree1080p| 亚洲精品有码在线| 亚洲bt天天射| 亚洲女人初尝黑人巨大| 成人黄色在线播放| 国产欧美一区二区三区在线看| 欧美夫妻性生活xx| 亚洲国产第一页| 欧洲永久精品大片ww免费漫画| 欧美激情国产日韩精品一区18| 国产精品久久久久久久久久免费| 国产成人精品一区二区| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品pans私拍| 欧美极品少妇xxxxⅹ喷水| 中文字幕日韩在线播放| 欧美一区二区色| www.欧美精品一二三区| 亚洲人成网站免费播放| 九九九久久久久久| 亚洲欧美国产精品久久久久久久| 国产欧美精品一区二区| 日韩在线不卡视频| 欧美日韩午夜剧场| 97色在线视频观看| 97在线视频观看| 91九色国产视频| 国产精品高清在线| 性视频1819p久久| 亚洲电影免费在线观看| 深夜福利亚洲导航| 亚洲欧美日韩中文在线| 亚洲资源在线看| 国产免费久久av| 久久综合88中文色鬼| 在线精品91av| 最近2019年手机中文字幕| 久久久久久久久爱| 国产69精品久久久久9| 国产精品久久久久久久久久久新郎| 中文字幕日韩在线视频| 免费av在线一区| 亚洲国产欧美一区二区丝袜黑人| 91sao在线观看国产| 一区三区二区视频| 欧美视频免费在线| 日韩精品久久久久久久玫瑰园| 成人xxxx视频| 亚洲综合中文字幕在线观看| 亚洲国产精品悠悠久久琪琪| 日韩hd视频在线观看| 亚州成人av在线| 国产精品96久久久久久又黄又硬| 国内精品久久久久影院优| 国产日韩精品在线播放| 色噜噜久久综合伊人一本| 亚洲欧美第一页| 国产成人久久久| 亚洲国产精品网站| 亚洲精品福利免费在线观看| 中文字幕免费精品一区| 国产69精品久久久久久| 成人乱人伦精品视频在线观看| 国产精品久久久久91| 日本成熟性欧美| 国产不卡av在线| 久久夜色精品亚洲噜噜国产mv| 中文字幕精品在线视频| 成人字幕网zmw| 国产精品久久二区| 中文字幕欧美日韩va免费视频| 亚洲精品在线不卡| 欧美日韩视频在线| 亚洲综合在线小说| 福利一区视频在线观看| 九九久久久久99精品| 久久久久一本一区二区青青蜜月| 91九色单男在线观看| 欧美www在线| 日韩视频中文字幕| 久久久av免费| 日韩av高清不卡| 成人欧美一区二区三区黑人| 日韩中文字幕在线视频播放| 成人情趣片在线观看免费| 黄色91在线观看| 亚洲白虎美女被爆操| 亚洲欧美日韩国产成人| 精品日韩视频在线观看| 亚洲黄色av女优在线观看| 亚洲第一区第一页| 欧美在线观看网址综合| 日韩免费在线免费观看| 亚洲自拍偷拍第一页|