uniapp-商城-66-shop(2-品牌信息显示,数据库读取的异步操作 放到vuex actions)

发布于:2025-05-25 ⋅ 阅读:(13) ⋅ 点赞:(0)

        完成页面的显示,但是还需要进行修改,这里涉及到修改中的信息同步显示。也会涉及到数据的读取,修改和同步。

        本文介绍了如何使用Vuex管理品牌数据,实现数据的同步显示和修改。主要内容包括:1.将获取品牌数据的异步操作封装到Vuex的actions中,减少重复代码;2.在组件中通过mapActions和mapMutations引入Vuex方法;3.在品牌信息修改或新增后,通过SET_BRAND方法立即更新状态,确保页面数据同步。这种方法避免了在每个页面重复请求数据,提高了代码复用性,同时实现了修改后的实时更新。

1、先看看原来的样子(屏蔽的代码)

        created() {
            this.getBrandData();  //通过mapActions 过来的接口  获取数据,代替下面的语句
            /*因为用了vuex的方式获取数据,就不用再重复写了 ,也避免下一个页面需要获取还要重新再写一次 在brand.js中*/
            /*
            brandCloudObj.get().then(res=>{
                this.SET_BRAND(res.data[0])
            })
            */
        },

2、将1的异步,抽离出来,封装到vuex 的 action中,便于引用

2.1 引入云对象

const brandCloudObj = uniCloud.importObject("green-mall-brand")
//导入云对象,和在页面逻辑中是一样的

2.2 定义一个异步操作

就是把我们的 云对象获取数据的操作,封装到vuex action。

const brandCloudObj = uniCloud.importObject("green-mall-brand")
//导入云对象,和在页面逻辑中是一样的

//定义brand ,包含state状态 ,mutations同步操作,actions异步操作
// https://blog.csdn.net/weixin_43529465/article/details/129806460  分析
const brand = {
	state: {
		// brandData: {},
		
		brandData: {
			// name:null  //要屏蔽掉,不然页面 show-headbar 上也会判断name有这一个键(key) 
			noBrandData: false //默认是有值 有品牌信息
		}
	},
	mutations: {
		// 作用:操作Vuex中的state属性数据。
		// mutations属性与getters 属性和 state属性平级,可以修改state中的数据。
		SET_BRAND(state, value) {
			state.brandData = value
		}
	},
	actions: {
		// 作用:修改state数据,异步修改。
		// 区别:actions是异步修改state中数据,mutations是同步修改state中数据。
		// 原理:actions中的方法并不能直接修操作state中的数据,需要触发mutations中的方法,最终还需要通过mutations中的方法修改数据
		//其实下面的请求,也可以放到页面上做数据请求,但是为了后期使用,总不可能每一个页面我们都做一个请求吧。这也就相当于一数据请求的封装,后期都用这一个就好
		//在shop-headbar 中,created,可以完成的请求放到了这里
		async getBrandData(context) { //context 是上下文标识,通过他 可以获取到state 以及 mutations 中的方法和变量
		
			let arr = Object.keys(context.state.brandData)  //Object.keys 获取对象的key成为一个数组
			if (arr.length) return;   //有数据,减少网络请求和浪费
			
			let res = await brandCloudObj.get();
			if (!res.data.length) { //判断 数据库中有没有品牌信息
				context.commit("SET_BRAND", { //通过 commit 执行,方法SET_BRAND
					noBrandData: true // 判断是没有值,就返回空
				})
				return;
			};
			context.commit("SET_BRAND", res.data[0]) //数据库有值,就返回数据库获取到的信息
		}
	}
}
export default brand

3、改写shop中shop-headbar组件中的 获取数据操作

3.1 导入 vuex 中 maoaction 的方法,屏蔽云对象的导入

    import {
        mapState,
        mapGetters,
        mapMutations,
        mapActions
    } from "vuex" //通过这里 才能使用mapGetters 中的 brandData
    import brand from "../../store/modules/brand";
    //引入mapMutations 便于引入state中的方法 SET_BRAND

// const brandCloudObj = uniCloud.importObject("green-mall-brand")   因为用了vuex的方式获取数据,就不用导入了  在brand.js中

3.2 在组件/页面的方法中,导入vuex action中的方法action中的 getdata

        methods: {
            ...mapMutations(["SET_BRAND"]), //同步处理  从brandData放到数据库  修改来用
            ...mapActions(["getBrandData"]), //异步处理  从数据库读取赋值给brandData 显示来用  修改时,就是先在修改界面显示,然后修改,然后在显示
        }

3.3 在created中使用该方法

        // 相当于页面中的 onload  在组件中使用 created
        created() {
            this.getBrandData();  //通过mapActions 过来的接口  获取数据,代替下面的语句
            /*因为用了vuex的方式获取数据,就不用再重复写了 ,也避免下一个页面需要获取还要重新再写一次 在brand.js中*/
            /*
            brandCloudObj.get().then(res=>{
                this.SET_BRAND(res.data[0])
            })
            */
        },

4、在brand.vue中使用 vuex 数据

在这个页面中,处理添加和修改两个功能,

如果是添加,那么在添加以前,在我们shop头部页面(shop-headbar组件)显示的就没有数据,以前的代码添加后,是不会立即显示;

如果是修改,那么在修改以前,在我们shop头部页面(shop-headbar组件)显示的就时以前的数据,以前的代码修改后,是不会立即更新;

4.1 要使用vuex的方法,让修改和添加都能立即更新到我们的shop页面上

导入 vuex中的方法

    import {
        mapMutations
    } from "vuex"

4.2 在处理修改和更新的逻辑的方法上,添加一个处理,修改页面中 shop-headbar的状态显示数据

//新增或者修改品牌啊信息 异步同步化
            async addAndUpdate() {
                let title;
                if (this.brandFormData._id) {
                    let res = await brandCloudObj.update(this.brandFormData)
                    title = "修改成功"
                } else {
                    //新增
                    await brandCloudObj.add(this.brandFormData)
                    title = "新增成功"
                }
                uni.showToast({
                    title,
                    mask: true
                })

                setTimeout(() => {
                    uni.navigateBack();
                }, 1500)

                this.SET_BRAND(this.brandFormData);
            }


网站公告

今日签到

点亮在社区的每一天
去签到