Vue2知识总结(从vuex到路由到el)终章

console.log(Vue.prototype)可以输出Vue原型属性

1:vuex:创建store。store包含commit、dispatch等函数,dispatch直接对话actions,commit直接对话mutations。

index.js

//引入vuex
import Vuex from'vuex'
import Vue from 'vue'
Vue.use(Vuex)

//响应组件中的动作
const actions={
    jia(context,value){
        context.commit('jia',value)
    },
    jian(context,value){
        context.commit('jian',value)
    },
    jiaOdd(context,value){
        if(context.state.sum%2){
            context.commit('jia',value)
        }
    }
}
//用于操作数据state
const mutations={
    jia(state,value){
        state.sum+=value
    },
    jian(state,value){
        state.sum-=value
    }
}
//用于操作存储数据
const state={
    sum:0
}



//创建并暴露store
export default new Vuex.Store({
    actions,
    mutations,
    state
})

main.js

import Vue from 'vue'
import App from './App.vue'

Vue.config.productionTip = false

//引入store
import store from './store'


new Vue({
  render: h => h(App),
  store
}).$mount('#app')

2:vuex求和案例

Count.vue

    <template>
    <div>
        <h1>当前求和为:{{$store.state.sum}}</h1>
        <select v-model.number="n">
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
        </select>
        <button @click="increment">+</button>
        <button @click="decrement">-</button>
        <button @click="incrementOdd">当前求和为奇数再加</button>
        <button @click="incrementWait">等一等再加</button>
    </div>
    </template>

    <script>
    export default {
        name:"Count",
        data() {
            return{
                n:1
            }
        },
        methods:{
            increment(){
                this.$store.dispatch('jia',this.n)
            },
            decrement(){
                this.$store.dispatch('jian',this.n)
            },
            incrementOdd(){
                this.$store.dispatch('jiaOdd',this.n)
            },
            incrementWait(){
                setTimeout(()=>{
                },500)
            }
        },
        beforeCreate(){
            console.log('Count',this)
        }

    }
    </script>

    <style lang="css">
        button{
            margin-left: 5px;
        }
    </style>

3:多组件共享数据

Count.vue

    <template>
    <div>
        <h1>当前求和为:{{$store.state.sum}}</h1>
        <h3>下方组件的总人数为:{{PersonList.length}}</h3>
        <select v-model.number="n">
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
        </select>
        <button @click="increment">+</button>
        <button @click="decrement">-</button>
        <button @click="incrementOdd">当前求和为奇数再加</button>
        <button @click="incrementWait">等一等再加</button>
    </div>
    </template>

    <script>
    export default {
        name:"Count",
        data() {
            return{
                n:1
            }
        },
        computed:{
            PersonList(){
                return this.$store.state.PersonList
            }
        }
        ,
        methods:{
            increment(){
                this.$store.dispatch('jia',this.n)
            },
            decrement(){
                this.$store.dispatch('jian',this.n)
            },
            incrementOdd(){
                this.$store.dispatch('jiaOdd',this.n)
            },
            incrementWait(){
                setTimeout(()=>{
                },500)
            }
        },
        beforeCreate(){
            console.log('Count',this)
        }

    }
    </script>

    <style lang="css">
        button{
            margin-left: 5px;
        }
    </style>

Person.vue

<template>
  <div>
    <h1>人员列表</h1>
    <input type="text" placeholder="请输入名字" v-model="name">
    <button @click="add">添加</button>
    <ul>
        <li v-for="p in personList" :key="p.id">{{p.name}}</li>
    </ul>
  </div>
</template>

<script>
import {nanoid} from 'nanoid'

export default {
    name:"Person",
    data(){
        return{
            name:''
        }
    }
    ,
    computed:{
        personList(){
            return this.$store.state.PersonList
        }
    },
    methods:{
        add(){
            const personObj={id:nanoid(),name:this.name}
            this.$store.commit('Add_person',personObj)
            this.name=''
        }
    }
}
</script>

<style>

</style>

index.js

//引入vuex
import Vuex from'vuex'
import Vue from 'vue'
Vue.use(Vuex)

//响应组件中的动作
const actions={
    jia(context,value){
        context.commit('jia',value)
    },
    jian(context,value){
        context.commit('jian',value)
    },
    jiaOdd(context,value){
        if(context.state.sum%2){
            context.commit('jia',value)
        }
    }
}
//用于操作数据state
const mutations={
    jia(state,value){
        state.sum+=value
    },
    jian(state,value){
        state.sum-=value
    },
    Add_person(state,value){
     state.PersonList.unshift(value)   
    }
}
//用于操作存储数据
const state={
    sum:0,
    PersonList:[
        {id:'001',name:'张三'}
    ]
}



//创建并暴露store
export default new Vuex.Store({
    actions,
    mutations,
    state
})

4:路由

index.js

import VueRouter from "vue-router";
import About from '../components/About'
import Home from '../components/Home'

//创建一个路由器
export default new VueRouter({
    routes:[
        {
            path:'/about',
            component:About
        },
        {
            path:'/home',
            component:Home
        }
    ]
})

About.vue

<template>
  <h2>我是About的内容</h2>
</template>

<script>
export default {
    name:"About"

}
</script>

<style>

</style>

Home.vue

<template>
    <h2>我是Home的内容</h2>
</template>

<script>
export default {
    name:'Home'
}
</script>

<style>

</style>

main.js

import Vue from 'vue'
import App from './App.vue'
import VueRouter from 'vue-router'
import router from './router'

Vue.config.productionTip = false

Vue.use(VueRouter)


new Vue({
  render: h => h(App),
  router
}).$mount('#app')

App.vue(router-view展示组件在哪)

<template>
  <div class="row">
    <div class="col-xs-2 col-xs-offset-2">
      <div class="list-group">
        <router-link class="list-group-item" active-class="active" to="/about">About</router-link>
        <hr>
        <router-link class="list-group-item" active-class="active" to="/home">Home</router-link>
      </div>
    </div>
    <div class="col-xs-6">
      <div class="panel">
        <div class="panel-body"></div>
        <router-view/>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: "App",
};
</script>

5:嵌套路由

Home.vue

<template>
   <div>
    <h2>Home组件内容</h2>
    <div>
        <ul>
            <li>
                <router-link to="/home/news">News</router-link>
            </li>
            <li>
                <router-link to="/home/message">Message</router-link>
            </li>
        </ul>
        <router-view></router-view>
    </div>
   </div>
</template>

<script>
export default {
    name:'Home'
}
</script>

<style>

</style>

Message.vue

<template>
  <div>
    <ul>
        <li v-for="m in messageList" :key="m.id">
            <router-link :to="{
                path:'/home/message/detail',
                query:{
                    id:m.id,
                    title:m.title
                }
            }">
            {{m.title}}
            </router-link>
        </li>
    </ul>
    <hr>
    <router-view></router-view>
  </div>
</template>

<script>
export default {
    name:"Message",
    data(){
        return {
            messageList:[
                {id:"001",title:"消息001"},
                {id:"002",title:"消息002"},
                {id:"003",title:"消息003"},
            ]
        }
    }
}
</script>

<style>

</style>

News.vue

<template>
  <div>
            <li>news001</li>
            <li>news002</li>
            <li>news003</li>
  </div>
</template>

<script>
export default {
  name:"News"
}
</script>

<style>

</style>

index.js

import VueRouter from "vue-router";
import About from '../components/About'
import Home from '../components/Home'
import News from '../pages/News'
import Message from '../pages/Message'
import Detail from '../pages/Detail'

//创建一个路由器
export default new VueRouter({
    routes:[
        {
            path:'/about',
            component:About
        },
        {
            path:'/home',
            component:Home,
            children:[{
                path:'news',
                component:News
            },{
                path:'message',
                component:Message,
                children:[{
                    path:'detail',
                    component:Detail
                }]
            }]
        }
    ]
})

App.vue

<template>
  <div class="row">
    <div class="col-xs-2 col-xs-offset-2">
      <div class="list-group">
        <router-link class="list-group-item" active-class="active" to="/about">About</router-link>
        <hr>
        <router-link class="list-group-item" active-class="active" to="/home">Home</router-link>
      </div>
    </div>
    <div class="col-xs-6">
      <div class="panel">
        <div class="panel-body"></div>
        <router-view/>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: "App",
};
</script>

 Detail.vue

<template>
  <div>
    <ul>
        <li>消息编号:{{$route.query.id}}</li>
        <li>消息标题:{{$route.query.title}}</li>
    </ul>
  </div>
</template>

<script>
export default {
    name:"Detail",

}
</script>

<style>

</style>

6:命名路由+路由props

index.js

import VueRouter from "vue-router";
import About from '../components/About'
import Home from '../components/Home'
import News from '../pages/News'
import Message from '../pages/Message'
import Detail from '../pages/Detail'

//创建一个路由器
export default new VueRouter({
    routes:[
        {
            name:'guanyu',
            path:'/about',
            component:About
        },
        {
            path:'/home',
            component:Home,
            children:[{
                path:'news',
                component:News
            },{
                path:'message',
                component:Message,
                children:[{
                    name:'xiangqing',
                    path:'detail',
                    component:Detail,
                    //props的第一种对象,值为对象,该对象的所有值都会以props形式传给Detail组件
                    //props:{a:1,b:'hello'}
                    //props的第二种写法,值为布尔值,将所有参数传给Detail
                    //props:true
                    //props第三种写法,值为函数
                    props($route){
                        console.log($route)
                        return {id:$route.query.id,title:$route.query.title}
                    }
                }]
            }]
        }
    ]
})

Detail.vue

<template>
  <div>
    <ul>
        <li>消息编号:{{$route.query.id}}</li>
        <li>消息标题:{{$route.query.title}}</li>
        <li>{{id}}</li>
        <li>{{title}}</li>
    </ul>
  </div>
</template>

<script>
export default {
    name:"Detail",
    props:['id','title']
}
</script>

<style>

</style>

7:

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值