用extend替代vuex的方案

Vue.js 中的数据管理与组件通信实践
本文展示了如何在 Vue.js 应用中通过创建一个简单的 store 模块实现数据共享、函数调用和计算属性的复用,避免了使用 Vuex 的复杂性。在 main.js 文件中,将 store 配置到 Vue 原型上,使得在组件中可以直接访问和修改数据。在组件模板中,展示了如何直接绑定 $store 数据和方法,以及响应式地更新视图。这种方法简化了状态管理,同时保持了数据的一致性。

store/index.js

import Vue from 'vue'

const store = Vue.extend({
    name: 'store',
    data() {
        return {
            count: 2,
            person: {
                name:'小明',
                age:23
            }
        }
    },
    methods:{
        changeAge(v){
            this.person.age=v
        }
    },
    computed: {
        dCount() {
            return this.count * this.count
        }
    }
})
export default new store

在main.js配置vue原型

import Vue from 'vue'
import App from './App.vue'
import store from './store'

Vue.prototype.$store = store;
new Vue({
  render: h => h(App),
}).$mount('#app')

在组件中使用

<template>
    <div class="container">
        <div>{{ $store.count }}*{{ $store.count }}={{ $store.dCount }}</div>
        <div>
            <button @click="$store.count++">add</button>
        </div>
        <div>
            姓名:
            <input type="text" v-model="$store.person.name" />
        </div>
        <div>年龄:{{ $store.person.age }}</div>
        <div>
            输入年龄:
            <input type="text" v-model="age" />
        </div>
        <div>
            <button @click="$store.changeAge(age)">resetAge</button>
        </div>
    </div>
</template>

<script>
export default {
    data() {
        return {
            age: this.$store.person.age
        }
    },
    mounted() {
        console.log(this.$store, 'store')
    }
}
</script>

<style scoped lang="scss">
</style>

这样写就实现了数据,函数,计算属性等在不同组件中的复用,保证了数据更改后的视图变化,写法也没有vuex复杂,不用每次在mutations才能更改数据

// store/index.js import Vue from 'vue' import Vuex from 'vuex' // 确保安装 Vuex: npm install vuex Vue.use(Vuex) // 创建 Vuex Store 实例 const store = new Vuex.Store({ state: { // 全局状态数据 goodListData: [], // 存储商品数据 token: null // 示例:存储用户令牌 }, mutations: { /** * 设置商品数据 * @param {Object} state Vuex状态对象 * @param {Array} data 商品数据数组 */ setGoodListData(state, data) { state.goodListData = data }, /** * 清空商品数据 */ clearGoodListData(state) { state.goodListData = [] }, // 其他 mutation... setToken(state, token) { state.token = token } }, getters: { // 获取商品数据 getGoodListData: state => state.goodListData, // 其他 getter... getToken: state => state.token }, actions: { // 异步操作示例 async fetchGoods({ commit }, params) { try { const res = await uni.request({ url: 'http://your-api/goods', method: 'GET', data: params }) commit('setGoodListData', res.data) return res.data } catch (error) { console.error('API请求失败:', error) throw error } } } }) // 导出 store 实例 export default store ../../../webProject/store-management-starter/store/index.js (2:7): "default" is not exported by "node_modules/@dcloudio/uni-mp-vue/dist/vue.runtime.esm.js", imported by "../../../webProject/store-management-starter/store/index.js". 14:20:23.935 at store/index.js:2:7 14:20:23.935 1: // store/index.js 14:20:23.935 2: import Vue from 'vue' 14:20:23.935 ^ 14:20:23.935 3: import Vuex from 'vuex' 14:21:07.910 ../../../webProject/store-management-starter/store/index.js (2:7): "default" is not exported by "node_modules/@dcloudio/uni-mp-vue/dist/vue.runtime.esm.js", imported by "../../../webProject/store-management-starter/store/index.js". 14:21:07.910 at store/index.js:2:7 14:21:07.910 1: // store/index.js 14:21:07.910 2: import Vue from 'vue' 14:21:07.910 ^ 14:21:07.910 3: import Vuex from 'vuex'
最新发布
11-25
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值