vuex的原理关键:使用vue实例管理状态
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<title>vuex 原理解析--源码精简写法</title>
</head>
<body>
<div id="root">{{data}}</div>
<div id="root2">{{data2}}</div>
<div id="root3">
<button @click="change">change</button>
</div>
<script>
function regiterPlugiin(Vue){
const vuex = {} // 模拟vue全家桶的vuex
vuex._vm = new Vue({ // 没有挂载在任何dom 上的vue实例
data:{
message:'hello vue.js'
}
})
vuex.state = vuex.vm //vue实例
vuex.mutation = {
setMessage(value) {
vuex.state.message = value
}
}
function init(){
this.$store = vuex
}
Vue.mixin({ // 全局mixin,对所有的vue实例创建的时候,执行init
beforeCreate:init
})
}
Vue.use(regiterPlugiin) //加载插件
new Vue({
el:'#root',
computed:{
data(){
return this.$store.state.message
}
}
})
new Vue({
el:'#root2',
computed:{
data2(){
return this.$store.state.message
}
}
})
new Vue({
el:'#root3',
methods:{
cahnge(){
const newValue = this.$store.state.message + '.'
this.$store.mutations.setMessage(newValue)
}
}
})
</script>
</body>
</html>