天天看點

Vue基礎複習

watch屬性:監聽指定值的變化(異步場景)

computed計算屬性:方法裡的任意一個值發生變化就會監聽到(資料關聯)

條件渲染:v-if v-else v-else-if  v-show

清單渲染:v-for

屬性綁定:v-bind:xxx (:xxx)    class綁定(:class) style綁定(:style)

vue-cli腳手架:

安裝全局vue-cli:$ npm install -g @vue/cli

建立項目:進入檔案目錄執行$ vue create hello-world

選擇預設建立,然後按需要添加其他庫,預設使用的是yarn,

安裝vuex、vue-router、less,yarn add ...

常用目錄結構:

Vue基礎複習

元件化思想:整體化、複用化、獨立化(300行原則、複用化原則)

元件狀态管理(vuex)

多元件的混合使用,多頁面,複雜業務(vue-router)

元件間傳參,消息,事件管理(props,emit/on,bus)

vue-router

元件頁面

<router-link to="/home">Home</router-link>

<router-view></router-view>
           

在router.js中定義router

import Router from "vue-router";
Vue.use(Router);

const routes = [
    {
        path: '/home',
        name: 'home',
        component: Home
    }
];
var router = new Router({
    routes
});

export default router;
           

動态路由:path變為/user/:id

<router-link to="/user/123"></router-link>
<router-link :to="{name:'user', params: {id: 123}}"></router-link>
           

在元件中想要獲得這個id值,可以通過this.$router來擷取router執行個體,可以定義一個computed屬性:

computed: {
    dynamicSegment() {
        return this.$router.params.id
    }
}
           

動态路由在來回切換時,由于指向元件,vue不會銷毀再建立這個元件,而是複用這個元件,元件的生命周期就沒有用了。就隻能在元件内部利用watch來監聽$router的變化

data() {
    return {
        dynamicSegment: ''
    }
}
watch: {
    $router(to, from) {
            // to表示你要去的元件,from表示的是從哪個元件來的
        this.dynamicSegment = to.params.id
    }
}
           

路由嵌套:

const routes = [
    {
        path: '/home',
        component: home,
        children: [
            {
                path: 'girl',
                component: girl
            },
            {
                path: 'boy',
                component: boy
            }
        ]
    }
]
           

vuex:元件狀态的集中管理

單項資料流: Actions -->state -->View -->Actions

多個視圖依賴于同一個狀态(菜單導航)

來自不同視圖的行為要更新同一狀态(彈幕)

store.js:

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
    state: {
        count: 0,
        list: [
            {id: 1, done: true},
            {id: 2, done: false}
        ] 
    },  // 元件的狀态
    getters: {
        todo: state => {
            return state.list.filter(el => el.done)
        }, // Getter接受state作為其第一參數

        todoCount: (state, getters) => {
            return getters.todo.length
        }, // Getter接受其他getter作為第二參數

        getTodoById: (state) => (id) => {
            return state.list.find(el => el.id === id)
        } // 讓getter傳回一個函數,來實作給getter傳參。在對store裡的數組進行查詢時非常有用
    }, // 相當于store的計算屬性,getter的傳回值會根據他的依賴被緩存起來,依賴值發生變化時會被重新計算
    mutations: {
        increase () {
            this.state.count ++
        }
    }, // 改變元件狀态的方法集
    actions: {

    }
})
           

元件中使用count值:

import store from '@/store';

export default {
    name: 'Info',
    store,
    data () {
        return {
            msg: store.state.count
        }
    }
}
           

元件中出發count變化的方法:

<template>
    <div>
        <button @click="add()">添加</button>
    </div>
</template>
<script>
import store from '@/store';
export default {
    name: 'Info',
    store,
    methods: {
        add() {
            store.commit('increase')
        }
    }
}
</script>
           
vue