vuex的原理關(guān)鍵:使用vue實(shí)例管理狀態(tài)
<!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實(shí)例
data:{
message:'hello vue.js'
}
})
vuex.state = vuex.vm //vue實(shí)例
vuex.mutation = {
setMessage(value) {
vuex.state.message = value
}
}
function init(){
this.$store = vuex
}
Vue.mixin({ // 全局mixin,對所有的vue實(shí)例創(chuàng)建的時(shí)候丹禀,執(zhí)行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>