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: