• Vuex入门


    目录

    一、Vuex中的各个js文件的用途

    1.vue中各个组件之间的传值

    2.Vuex

    3.Vuex使用步骤

    4.Vuex的核心概念

    二、Vuex同步存值和存值

    三、Vuex的异步加载及后台调用问题

    1、异步加载

     2、后台调用


    一、Vuex中的各个js文件的用途

    1.vue中各个组件之间的传值

    图解:

    1.父子组件

       父组件-->子组件,通过子组件的自定义属性:props

       子组件-->父组件,通过自定义事件:this.$emit('事件名',参数1,参数2,...);

       2.非父子组件或父子组件

       通过数据总数Bus,this.$root.$emit('事件名',参数1,参数2,...)

       3.非父子组件或父子组件

       更好的方式是在vue中使用vuex

       方法1: 用组件之间通讯。这样写很麻烦,并且写着写着,估计自己都不知道这是啥了,很容易写晕。

       方法2: 我们定义全局变量。模块a的数据赋值给全局变量x。然后模块b获取x。这样我们就很容易获取到数据

    2.Vuex

    图解:

     官方解释:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。可以想象为一个“前端数据库”(数据仓库),

       让其在各个页面上实现数据的共享包括状态,并且可操作

       

       Vuex分成五个部分:

       1.State:单一状态树

       2.Getters:状态获取

       3.Mutations:触发同步事件

       4.Actions:提交mutation,可以包含异步操作

       5.Module:将vuex进行分模块

    3.Vuex使用步骤

    ①、安装

    //安装的是最新版本

     npm install vuex -S

    // 更改版本

     npm i -S vuex@3.6.2

    ②、创建store模块,分别维护 state/actions/mutations/getters

     ③、 store/index.js文件中新建vuexstore实例,并注册上面引入的各大模块

    index.js

    1. import Vue from 'vue'
    2. import Vuex from 'vuex'
    3. import state from './state'
    4. import getters from './getters'
    5. import actions from './actions'
    6. import mutations from './mutations'
    7. Vue.use(Vuex)
    8. const store = new Vuex.Store({
    9. state,
    10. getters,
    11. actions,
    12. mutations
    13. })
    14. export default store

    ④、将Vuex对应的index.js 挂载到 main.js中的vue实例中

    1. import store from './store'
    2. new Vue({
    3. el: '#app',
    4. store,
    5. router,
    6. data(){
    7. return{
    8. // 在vue根实例中定一个变量,这个变量就是vue实例,它总线
    9. // props this.$emit
    10. Bus:new Vue({})
    11. }
    12. },
    13. components: { App },
    14. template: ''
    15. })

    ⑤测试

    在state.js文件中定义一个变量

    1. export default{
    2. resName:'忘忧酒馆'
    3. }

     然后在sys文件夹中建立一个.vue文件

    1. <template>
    2. <div>
    3. <p>欢迎来到{{msg}}p>
    4. div>
    5. template>
    6. <script>
    7. export default {
    8. name: 'HelloWorld',
    9. data () {
    10. return {
    11. }
    12. },
    13. computed:{
    14. msg(){
    15. // 从vuex的state文件中获取值
    16. return this.$store.state.resName;//不推荐
    17. // this.&router.pust()..
    18. // this.$root.Bus.$on()
    19. }
    20. }
    21. }
    22. script>
    23. <style>
    24. style>

     然后创建路由

    效果:

    4.Vuex的核心概念

    核心概念:store、state、getters、mutations、actions

      store:

          每一个Vuex应用的核心就是store(仓库),store基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。

          const store = new Vuex.Store({

           state,    // 共同维护的一个状态,state里面可以是很多个全局状态

           getters,  // 获取数据并渲染

           actions,  // 数据的异步操作

           mutations  // 处理数据的唯一途径,state的改变或赋值只能在这里

          })

    二、Vuex同步存值和存值

    ①、编写getters.js和mutations.js

    getters.js

    1. export default{
    2. getResName:(state)=>{
    3. return state.resName;
    4. }
    5. }

    mutations.js

    1. export default{
    2. setResName:(state,payload)=>{
    3. // state对象就对应了state.js中的对象
    4. // payload载荷 对应的 传递的 json对应参数{name:zs,age:12}
    5. state.resName=payload.resName;
    6. }
    7. }

     ②、编写VuexPage1.vue和VuexPage2.vue

    VuexPage1.vue

    1. <template>
    2. <div>
    3. <p>页面1:欢迎来到{{msg}}p>
    4. <button @click="buy">盘它button>
    5. div>
    6. template>
    7. <script>
    8. export default {
    9. name: 'VuexPage1',
    10. data () {
    11. return {
    12. }
    13. },
    14. methods:{
    15. buy(){
    16. // 通过conmmit方法 会 调用 mutations.js文件中定义好的方法
    17. this.$store.commit("setResName",{
    18. resName:'云中海'
    19. })
    20. }
    21. },
    22. computed:{
    23. msg(){
    24. // 从vuex的state文件中获取值
    25. // return this.$store.state.resName;//不推荐,不安全
    26. // 通过 getters.js文件获取 state.js中定义的变量值
    27. return this.$store.getters.getResName;
    28. // this.&router.pust()..
    29. // this.$root.Bus.$on()
    30. }
    31. }
    32. }
    33. script>
    34. <style>
    35. style>

    VuexPage2.vue

    1. <template>
    2. <div>
    3. <p>页面2:欢迎来到{{msg}}p>
    4. div>
    5. template>
    6. <script>
    7. export default {
    8. name: 'VuexPage2',
    9. data () {
    10. return {
    11. }
    12. },
    13. computed:{
    14. msg(){
    15. // 从vuex的state文件中获取值
    16. // return this.$store.state.resName;//不推荐,不安全
    17. // 通过 getters.js文件获取 state.js中定义的变量值
    18. return this.$store.getters.getResName;
    19. // this.&router.pust()..
    20. // this.$root.Bus.$on()
    21. }
    22. }
    23. }
    24. script>
    25. <style>
    26. style>

    然后编写路由

    注1:mutations中方法的调用方式

               不能直接调用this.$store.mutations.setResturantName('KFC'),必须使用如下方式调用:

               this.$store.commit(type,payload);

               // 1、把载荷和type分开提交

               store.commit('setResturantName',{

                 resturantName:'KFC'

               })

               // 2、载荷和type写到一起

              store.commit({

                type: 'setResturantName',

                resturantName: 'KFC'

              })

               

          注2:一定要记住,Mutation 必须是同步函数。为什么呢?异步方法,我们不知道什么时候状态会发生改变,所以也就无法追踪了

    效果:

    三、Vuex的异步加载及后台调用问题

    1、异步加载

    ①、编写actions.js

    1. export default{
    2. setResNameAsync:(context,payload)=>{
    3. // 异步修改值 在异步方法中调用了同步方法
    4. // context指的是vuex的上下文,相当于 this.$store
    5. // 此代码6s后执行
    6. setTimeout(function(){
    7. context.commit("setResName",payload);
    8. },6000);
    9. }
    10. }

    ②、给VuexPage1.vue写个异步的方法

    1. <button @click="buyAsync">最后的酒馆button>
    2. //方法
    3. buyAsync() {
    4. this.$store.dispatch("setResNameAsync", {
    5. resName: '墨然酒馆'
    6. })
    7. }

    效果:

     2、后台调用

    ①、将以下代码加入到actions.js

    1. let _this=payload._this;
    2. let url = _this.axios.urls.SYSTEM_MENU_TREE;
    3. _this.axios.post(url,{}).then(r=>{
    4. console.log(r);
    5. }).catch(e=>{
    6. });

    ②、在VuexPgex1的异步方法中加入以下代码

    _this:this

    效果:

  • 相关阅读:
    Android 15新特性,强制edge-to-edge全面屏体验
    day08-Windows备份与灾难恢复
    Ae 效果:CC Page Turn
    Windows安装MySQL8.0完整教程
    从零学习 InfiniBand-network架构(六)—IB协议链路层QoS如何实现
    JVM判断对象是否存活之引用计数法、可达性分析
    企业电子招标采购系统源码Spring Boot + Mybatis + Redis + Layui + 前后端分离 构建企业电子招采平台之立项流程图
    虚拟机和Docker有什么区别?
    ReentrantReadWriteLock(可重入读写锁)
    Java学习——泛型通配符
  • 原文地址:https://blog.csdn.net/m0_62604616/article/details/126859044