溫習vue

腳手架

  • 安裝腳手架

  • 關閉source-map

    • config>index.js>productionSourceMap:false
  • 壓縮gzip

    • yarn add compression-webpack-plugin
    • config>index.js>productionGzip: true
    • 后端服務器中間件開啟gzip支持
      • nginx:
    //nginx.conf
    gzip on;
    gzip_types application/javascript application/octet-stream text/css image/jpeg;  
    
  • 修改靜態資源根路徑(假設要把所有靜態資源放在xxx項目目錄下)

    • config>index.js>build>assetsPublicPath: '/xxx/'

注入vuex

  • 安裝
//yarn add vuex
import Vue from 'vue'
import App from './App'
import router from './router'
/*
1.將vuex的所有方法注入到每個子類
2.用store配置文件生成一個注冊了get set監聽的新實例
3.將生成的新實例放入Vue實例屬性中
 */
import Vuex from 'vuex'
//引入store配置文件
import storeConfig from './store/index'
Vue.config.productionTip = false;
//注入到每個實例中,讓每個實例都有訪問Vuex方法的權限
Vue.use(Vuex);
//將store配置文件注冊監聽
const store = new Vuex.Store(storeConfig);

new Vue({
  el: '#app',
  router,
//將注冊號監聽后的store實例放到vue實例中,讓每個vue實例都可以訪問到store實例
  store,
  template: '<App/>',
  components: { App }
})
  • 用法
//storeConfig.js
import axios from 'axios';

export default {
  //設置子模塊store 并配置每個模塊的命名空間
  modules: {
    "index": {
      namespaced: true,
      state: {
        count: 0
      },
      //用于處理state,不能執行異步操作,在vue實例中用$store.commit(funcName,param)調用
      mutations: {
        increment(state, params) {
          console.log(params);
          state.count++
        }
      },
      actions: {
        //雖然mutaions不能異步處理,
        //但是可以用actions異步處理后調用傳入的store實例的commit來調用mutations,
        //使用$store.dispatch(funcName,param)調用
        async addCount({rootState, state, commit}, params) {
          let res = null;
          try {
            res = await axios.get("xx/xx");
            commit("increment", res.data);
          } catch (error) {
            commit("increment", "error");
            console.log(error);
          }
        }
      },
      //類似computed
      //$store.getters.myCount返回的是一個函數->閉包引用了state
      //此時傳遞參數給返回的函數就可以獲取一個處理過的state值
      getters: {
        myCount(state) {
          return num => state.count + num;
        }
      }
    }
  }
}




//App.vue
<template>
  <div id="app">
    <img src="./assets/logo.png">
    <router-view/>
    <div class="test-bg">{{count}}</div>
    <div class="test-bg">{{oriCount}}</div>
  </div>
</template>

<script>
//  vuex提供了一些工具供使用
import {mapGetters,mapActions,mapState} from 'vuex'
export default {
  name: 'app',
  created(){
//    這兩句作用相當
    this.$store.dispatch("index/addCount","test");
    this.pulCount("test");
  },
  methods:{
    ...mapActions("index",{
      pulCount:"addCount"
    })
  },
  computed:{
//    第一個參數是命名空間,第二個參數是注入了state的計算數學
    ...mapState("index",{
      oriCount:state=>state.count
    }),
    ...mapGetters("index",[
      "myCount"
    ]),
    count(){
      return this.myCount(2);
    }
  }
}
</script>

<style>
</style>

注入router

  • 安裝
    • yarn add vue-router
  • 用法
    • 配置和vuex一樣
    • 設置每個路由標題
```javascript
router.beforeEach((to, from, next) => {
  document.title = to.meta.title||'龍城e駕';
  next()
});
```

- 路由使用


```javascript
//點擊轉跳路由
    <router-link :to="{path:'hello',query:{name:'vijay'}}">hello</router-link>
//獲取路由路徑參數
this.$router.currentRoute.query["name"]
//
```
- 嵌套路由
    //config
    import HelloWorld from '@/components/HelloWorld'
import asd from '@/components/asd'

export default {
  routes: [
    {
      path: '/hello',
      name: 'HelloWorld',
      component: HelloWorld,
      children:[
        {
          path: '/xx',
          component: asd,
        }
      ]
    },
    
  ]
}
//HelloWorld.vue
//在子控件中點擊切換路由 也會顯示到子控件的routerview上
  <router-link :to="{path:'/xx'}">asdasda</router-link>
    <router-view/>
  • 子父路由通信
  • 父->子路由傳參數請看上面
  • 子->父 傳參數
//child.vue
created() {
       this.$emit("hello","test","test2");
       }
//parent.vuew
<router-view  @hello="listener" />
methods:{
   listener(p1,p2){
     console.log(p1,p2);
   }
 },       

vue語法

  • 通信

    • 子->父(雙向數據綁定)
    //子
    <input type="text" v-model="myName">
    export default {
    props: {
      name: String
    },
    computed: {
    //自定義一個計算屬性,通過重寫他的get set來充當雙向數據綁定的媒介
      myName: {
        get() {
          return this.name;
        },
        set(val) {
          this.$emit("update:name", val);
        }
      }
    }
    }
      
    //父
    //.sync其實是實現了一個@update:name="val=>name=var"的語法糖
    <asd-component :name.sync="name"></asd-component>
      
    
    • 父->子通信
```javascript
//父
//:name等于v-bind:name="xxx"
<asd-component :name="name"></asd-component>
//子
props: {
  name:{
     type: String,
     default:"默認值"
  }
},
```
  • 監聽指令修飾符

    • @click.prevent:表示讓元素不觸發默認事件,等同于在事件函數內調用event.preventDefault。(如:讓按鈕不提交表單)
    • @click.stop:讓元素的事件不冒泡,等同于stopPropagation
    • e.target是當前觸發事件的元素,e.currentTarget是當前處理事件的元素
  • 計算屬性與偵查器(watchs)

    • 計算屬性用于對某個屬性數據的封裝處理返回一個處理后的值,以及充當雙向數據綁定的媒介
    • 偵查器用于監聽某個屬性數據值發生改變時,觸發另一個事件(函數),不需要像data屬性那樣作為數據使用的情況。
  • 動態綁定html元素屬性

    //html
      <div class="hello" :class="{'active':isActive,'error':isError}">hello</div>
      //js
       data() {
        return {
          name:"vijay",
          isActive:true,
          isError:true
        }
    }
    //渲染結果
    <div data-v-469af010="" class="hello active error">hello</div>
    
    • 當然,也可以綁定一個計算屬性或者三元表達式去計算出class值
    • 綁定style屬性時,要傳入一個對象,css樣式作為屬性時名稱要寫成駝峰式
  • vue的數組屬性無法監聽length的get set.所以在修改length或者使用arr[xindex]=x的時候修改數組角標上的內容是無法觸發頁面更新的,所以建議使用數組的splice方法(因為數組方法被vue重寫了)進行角標替換或者新增角標賦值,arr.splice(開始角標,刪除幾個角標,替換成什么值)。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容

  • Vue 實例 屬性和方法 每個 Vue 實例都會代理其 data 對象里所有的屬性:var data = { a:...
    云之外閱讀 2,233評論 0 6
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,836評論 18 139
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內容,還有我對于 Vue 1.0 印象不深的內容。關于...
    云之外閱讀 5,071評論 0 29
  • 1.安裝 可以簡單地在頁面引入Vue.js作為獨立版本,Vue即被注冊為全局變量,可以在頁面使用了。 如果希望搭建...
    Awey閱讀 11,070評論 4 129
  • 當我朝你走了九十九步而你卻一步也未曾向我靠近。 失望越攢越多。 對話只剩早安晚安恩恩好吧噢噢。 你看著他他看著手機...
    七七阿77閱讀 178評論 0 0