前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Vue3.0商店后台管理系统项目实战-vuex是什么(5大语法)

Vue3.0商店后台管理系统项目实战-vuex是什么(5大语法)

作者头像
王小婷
发布2022-10-28 10:05:41
5600
发布2022-10-28 10:05:41
举报
文章被收录于专栏:编程微刊编程微刊

参考资料

Vue3.0官方文档:https://cn.vuejs.org/ Element Plus文档:https://element-plus.gitee.io/zh-CN/

打开默认的stroe/index.js

vuex中一共有五个状态 State Getter Mutation Action Module 下面进行详细讲解

代码语言:javascript
复制
import { createStore } from 'vuex'

export default createStore({
  //全局的状态初始化
  state: {
  },
  //计算state,获取对应的值
  getters: {
  },
  //更新状态的方法  更新state的唯一方法  commit  mutations
  mutations: {
  },
  //可以异步操作,可以返回promise  更改数据还是传递到mutations去更改
  actions: {
  },
  //数据比较多,分模块
  modules: {
  }
})
vuex的具体语法
1:state
代码语言:javascript
复制
提供唯一的公共数据源,所有共享的数据统一放到store的state进行储存,相似与data

首先在index.js里面初始一个数值

在登录界面login.vue引入store

在setup里面获取

在data里面定义

在页面展示一下

这个时候是可以拿到值的

2:mutations
代码语言:javascript
复制
更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的事件类型 (type)和一个回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数:

接下来进行修改 setCount里面有两个属性

在登录按钮上写一个点击事件

在页面触发 登录按钮绑定触发事件

代码语言:javascript
复制
<el-button type="primary" @click="handleLogin()">登录</el-button>

打印一下结果

3:actions:进行异步操作
代码语言:javascript
复制
Action和Mutation相似,Mutation 不能进行异步操作,若要进行异步操作,就得使用Action

//可以一步操作,可以返回promise,根呷 比如说修改 setCount()是异步的

代码语言:javascript
复制
//可以异步操作,可以返回promise  更改数据还是传递到mutations去更改
  actions: {
    setCountPromise(context, num) {
      return new Promise((resolve, reject) => {
        if (num > 100) {
          reject("值不能大于100")
        } else {
          context.commit("setCount", num)
          resolve()
        }

      })
    }
  },
代码语言:javascript
复制
 const handleLogin = () => {
      //  store.commit("setCount", 100);

      store.dispatch("setCountPromise", 100)
        .then((res) => {
          alert("修改成功");
        })
        .catch((err) => {
          alert(err);
        });
      console.log(store.state.count);
    };

点击登录按钮 弹出修改成功 并打印100

4:Getters
代码语言:javascript
复制
类似于vue中的computed,进行缓存,对于Store中的数据进行加工处理形成新的数据
代码语言:javascript
复制
 //计算state,获取对应的值
  getters: {
    countStatus(state){
      return state.count>=1
    }
  },

在login.vue里面去拿countStatus

代码语言:javascript
复制
   console.log("修改前getters", store.getters.countStatus);
    const handleLogin = () => {
      //  store.commit("setCount", 100);

      store
        .dispatch("setCountPromise", -100)
        .then((res) => {
          alert("修改成功");
        })
        .catch((err) => {
          alert(err);
        });
      console.log(store.state.count);
      console.log("修改后getters", store.getters.countStatus);
    };
5:Modules:分模块
代码语言:javascript
复制
当遇见大型项目时,数据量大,store就会显得很臃肿,为了解决以上问题,Vuex 允许我们将 store 分割成模块(module)。
每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割:

在store里面新建一个state的文件夹、在文件夹下新建num.state.js的文件

将store/index.js里面的vuex全部都剪切到num.state.js

num.state.js

代码语言:javascript
复制
export default {
    namespaced: true,

    //全局的状态初始化
    state: {
        count: 1,
    },
    //计算state,获取对应的值
    getters: {
        countStatus(state) {
            return state.count >= 1
        }
    },
    //更新状态的方法  更新state的唯一方法  commit  mutations
    mutations: {
        setCount(state, num) {
            state.count = num
        }
    },
    //可以异步操作,可以返回promise  更改数据还是传递到mutations去更改
    actions: {
        setCountPromise(context, num) {
            return new Promise((resolve, reject) => {
                if (num > 100) {
                    reject("值不能大于100")
                } else {
                    context.commit("setCount", num)
                    resolve()
                }

            })
        }
    },
  
}

store/index.js删减

代码语言:javascript
复制
import { createStore } from 'vuex'
import number from "./state/num.state.js"

export default createStore({
 
  //数据比较多,分模块
  modules: {
    number
  }
})

login.vue里面也需要修改一下

代码语言:javascript
复制
<template>
  <div class="login_wrap">
    <div class="form_wrap">
      <el-form
        ref="formRef"
        :model="loginData"
        label-width="100px"
        class="demo-dynamic"
      >
        <el-form-item
          prop="username"
          label="用户名"
          :rules="[
            {
              required: true,
              message: '此项为必填项',
              trigger: 'blur',
            },
          ]"
        >
          <el-input v-model="loginData.username" />
        </el-form-item>

        <el-form-item
          prop="password"
          label="密码"
          :rules="[
            {
              required: true,
              message: '此项为必填项',
              trigger: 'blur',
            },
          ]"
        >
          <el-input type="password" v-model="loginData.password" />
        </el-form-item>

        <el-form-item>
          <el-button type="primary" @click="handleLogin()">登录</el-button>
          <p>{{ num }}</p>
          <!-- <el-button @click="addDomain">New domain</el-button>
      <el-button @click="resetForm(formRef)">Reset</el-button> -->
        </el-form-item>
      </el-form>
    </div>
  </div>
</template>

<script>
import { reactive, toRefs } from "vue";

//引入useStore
import { useStore } from "vuex";

export default {
  name: "login",
  setup() {
    const store = useStore();
    const count = store.state.number.count; 

    const data = reactive({
      loginData: {
        username: "",
        password: "",
      },
      num: count,
      // countStatus:
    });

    console.log("修改前getters", store.getters["number/countStatus"]);
    const handleLogin = () => {
      //  store.commit("setCount", 100);

      store
        .dispatch("number/setCountPromise", -100)
        .then((res) => {
          alert("修改成功");
        })
        .catch((err) => {
          alert(err);
        });
      console.log(store.state.number.count);
      console.log("修改后getters",store.getters["number/countStatus"]);
    };
    return {
      ...toRefs(data),
      handleLogin,
    };
  },
};
</script>
<style scoped>
.login_wrap {
  width: 100%;
  height: 100vh;
  background: #2d3761;
  position: relative;
}
.form_wrap {
  position: fixed;
  top: 50%;
  transform: translate(130%, -50%);
  background: #fff;
  padding: 30px 50px;
  border-radius: 5px;
}
</style>

修改成功之后看一下效果

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-10-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • vuex的具体语法
    • 1:state
      • 2:mutations
        • 3:actions:进行异步操作
        • 4:Getters
        • 5:Modules:分模块
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档