vm.observable实现vuex

实现之前首先引用一下官网的话:

如果您不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的。确实是如此——如果您的应用够简单,您最好不要使用 Vuex。一个简单的store 模式 就足够您所需了。

在vue2.6.0 之前的一些状态缓存都依赖于store || storage 这对于一些较小型的应用来讲是比较臃肿的 那么我们的observable就诞生了 其主要实现与轻量级,跨组件的数据响应式。你可以直接在不依赖于vuex的情况下处理你的响应数据。

g98rh-xzjb7.gif

具体的代码:
index.js :

import Vue from 'vue'

export const store = Vue.observable({
  count: 0
})


export const mutations = {
  _addCount() {
    store.count++
  },
  _subCount(){
    store.count--
  }
}

parent.vue:

<template>
  <div class="all">
    <h1>parent: {{ count }}</h1>
    <el-button @click="() => _addCount()">add count</el-button>
    <ObservableCom />
  </div>
</template>

<script>
import { store, mutations } from './index'
import ObservableCom from './components/ObservableCom'

export default {
  components: { ObservableCom },
  computed: {
    count() { return store.count }
  },
  methods:{
    ...mutations
  }
}
</script>

<style lang="scss" scoped>
  .all {
    width: 800px;
    height: 400px;
    border: 1px solid red;
    margin: 50px auto;
  }
</style>

children.vue:

<template>
  <div class="observable-com">
    <h3>children: {{ count }}</h3>
    <el-button @click="() => _subCount()">sub count</el-button>
  </div>
</template>

<script>
import { store, mutations } from '../index'

export default {
  computed: {
    count() { return store.count }
  },
  methods: {
    ...mutations
  }
}
</script>

<style lang="scss" scoped>
  .observable-com {
    width: 400px;
    height: 200px;
    border: 1px solid red;
    margin: 0 auto;
  }
</style>
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容