1. bus的使用
原理:其实bus就相当于一个vue实例,兄弟之间的数据传输是要基于vue实例(也就是创建好的bus)
创建一个bus.js文件
import Vue from 'vue'
const Bus = new Vue();
export default Bus
在maini.js中导入该文件
import Bus from './lab/bus'
Vue.prototype.$bus = Bus
email.vue发送数据
<template>
<div class="email">
<button @click="handleClick">按我</button>
</div>
</template>
<script>
export default {
methods: {
handleClick(){
this.$bus.$emit('on-click', 'hello')
}
}
}
</script>
tel.vue接收数据
<template>
<div class="tel">
<p>{{message}}</p>
</div>
</template>
<script>
export default {
data(){
return {
message: ''
}
},
mounted(){
this.$bus.$on('on-click', mes => {
this.message = mes
})
}
}
</script>
2.vuex
首先在store文件夹里的index.js中,定义vuex实例
import Vue from 'vue'
import Vuex from 'vuex'
import state from './state' //单独出来的state
import mutations from './mutations' //单独出来的mutations
import actions from './actions' //单独出来的actions
import user from './module/user' //自定义模块,每个模块拥有自己的 state、mutation、action、getter
Vue.use(Vuex)
export default new Vuex.Store({
state,
mutations,
actions,
modules: {
user
}
})
在main.js中定义:
import store from './store'
new Vue({
store,
render: h => h(App)
}).$mount('#app')
(1)怎么使用vuex呢:
① state.js
const state = {
appName: 'admin'
}
export default state
任意组件中:
<template>
<div>
<p>{{appName}}</p>
</div>
</template>
<script>
export default {
computed: {
appName(){
return this.$store.state.appName
}
}
}
</script>
② 在模块中定义
const state = {
userName: 'gfz'
};
<template>
<div>
<p>{{userName}}</p>
</div>
</template>
<script>
export default {
computed: {
userName(){
return this.$store.state.user.userName //user代表模块名
}
}
}
</script>
③ mapState
<template>
<div>
<p>appName: {{appName}}</p>
<p>userName: {{userName}}</p>
</div>
</template>
<script>
import { mapState } from 'vuex'
export default {
computed: {
...mapState({
appName: state => state.appName,
userName: state => state.user.userName
})
}
}
</script>
(2) getters的使用:
在getters.js中,把getters定义到index.js中
const getters = {
appNameWithVersion: (state) => {
return state.appName + 'v2.0'
}
}
export default getters
使用
① 直接使用
<template>
<div>
<p>appNameWithVersion: {{appNameWithVersion}}</p>
</div>
</template>
<script>
export default {
computed: {
appNameWithVersion(){
return this.$store.getters.appNameWithVersion
}
}
}
</script>
② mapGetters
import { mapGetters } from 'vuex'
computed: {
...mapGetters([
'appNameWithVersion'
])
},
定义在模块中其实也是差不多的用法
(2)mutations的使用
//mutations.js
const mutations = {
SET_APP_NAME(state, params){
state.appName = params
}
}
export default mutations
<template>
<div>
<p>appName: {{appName}}</p>
<button @click="handleChangeAppName">修改appName</button>
</div>
</template>
<script>
export default {
methods: {
handleChangeAppName(){
this.$store.commit('SET_APP_NAME', 'newAppName')
}
}
}
</script>
想自己在state中设置一个值
//mutations.js
import vue from 'vue'
const mutations = {
SET_APP_VERSION(state){
vue.set(state, 'appVersion', 'v2.0')
}
}
export default mutations
<template>
<div>
<p>appName: {{appName}}</p>
<p>userName: {{userName}}</p>
<button @click="handleChangeAppName">修改appName</button>
<p>{{appVersion}}</p>
</div>
</template>
<script>
import { mapState, mapGetters } from 'vuex'
export default {
methods: {
handleChangeAppName(){
this.$store.commit('SET_APP_NAME', 'newAppName');
this.$store.commit('SET_APP_VERSION')
}
},
computed: {
...mapState({
appName: state => state.appName,
appVersion: state => state.appVersion,
userName: state => state.user.userName
})
}
}
</script>
mapMutations的使用
import { mapMutations } from 'vuex'
export default {
methods: {
...mapMutations([
'SET_APP_NAME'
]),
handleChangeAppName(){
// this.$store.commit('SET_APP_NAME', 'newAppName');
// this.$store.commit('SET_APP_VERSION')
this.SET_APP_NAME('newAppName');
}
}
}
使用mapMutations
const mutations = {
SET_USER_NAME (state, params) {
state.userName = params
}
};
<template>
<div>
<p>userName: {{userName}}</p>
<button @click="handleChangeUserName">修改用户名</button>
</div>
</template>
<script>
import { mapState, mapGetters, mapMutations } from 'vuex'
export default {
methods: {
...mapMutations([
'SET_USER_NAME'
]),
handleChangeUserName(){
this.SET_USER_NAME('vue-cource')
}
},
computed: {
...mapState({
userName: state => state.user.userName
}),
}
}
</script>
(3) actions的使用
① 首先定义一个请求
export const getAppName = () => {
return new Promise((resolve, reject) => {
const err = null;
setTimeout(() => {
if(!err){
resolve({code: 200, info: {appName: 'newAppName'}})
}
else{
reject(err)
}
})
})
}
在actions.js中
import {getAppName} from '@/api/app.js'
const action = {
updateAppName({commit}){
getAppName().then(res => {
commit('SET_APP_NAME', res.info.appName)
}).catch(err => {
console.log(err)
});
}
}
export default action
最后在组件里面使用actions
<template>
<div>
<button @click="handleChangeAppName">修改appName</button>
</div>
</template>
<script>
import { mapActions } from 'vuex'
export default {
methods: {
...mapActions([
'updateAppName'
]),
handleChangeAppName(){
this.updateAppName();
}
}
}
</script>
版权声明:本文为qq_40519017原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。