• vue-vuex


    读不懂系列:

      专业介绍:

        Vuex是一个专为Vue开发的应用程序的状态管理模式,它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

      总而言之:

        Vuex采用类似全局对象的形式来管理所有组件的公用数据,如果想修改这个全局对象的数据,得按照Vuex提供的方式来修改(不能自己随意用自己的方式来修改)。

    优点:

      Vuex状态管理跟使用传统全局变量的不同之处:

        1.Vuex的状态存储是响应式的:就是当你的组件使用到了这个Vuex的状态,一旦它改变了,所有关联的组件都会自动更新相对应的数据,这样开发者省事很多。

        2.不能直接修改Vuex的状态:如果是个全局对象变量,要修改很容易,但是在Vuex中不能这样做,想修改就得使用Vuex提供的唯一途径:显示地提交(commint)mutations来实现修改(没了解过这里没关系,下一节前端君会有介绍)。这样做的好处就是方便我们跟踪每一个状态的变化,在开发过程中调试的时候,非常实用。

    用处:

      (子组件想父组件传值使用prop)  (父组件向子组件传值用$emit)

      Vue的项目中,如果项目简单, 父子组件之间的数据传递可以使用  props 或者 $emit 等方式 进行传递;但是如果是大中型项目中,很多时候都需要在不相关的平行组件之间传递数据,并且很多数据需要多个组件循环使用。这时候再使用上面的方法会让项目代码变得冗长,并且不利于组件的复用,提高了耦合度。Vue 的状态管理工具 Vuex 完美的解决了这个问题。

    小实例:

    • 首先在src文件夹下创建一个新的文件夹叫store,在store文件夹下创建一个store.js的文件;
    • 在store.js的文件中初始化:
    import Vue from 'vue';//导入;
    import Vuex from 'vuex';//导入;
    Vue.use(Vuex);//使用;
    //初始化数据;
    const state = {
      testMsg:'这是demo的原始数据',
      childText:'这是child的原始数据'
    };
    //改变的方法;
    const mutations = {
      changeTestMsg(state,str){
        state.testMsg=str;
      },
      changeChildText(state,str){
        state.childText=str;
      }
    }
    //创建vuex中的store对象,并导出;
    export default new Vuex.Store({
      state:state,
      mutations:mutations
    })
    • 在父文件下:
    <template>
        <div>
          <div class="head">
            <div>demo页面</div>
            <div>
              <button @click="pchangep">改变demo页面数据</button>
              <button @click="pchangec">改变child页面数据</button>
            </div>
            <div>Test:{{msg}}</div>
          </div>
          <child></child>
        </div>
    </template>
    
    <script>
      import child from "./child.vue";
      import store from "../store/store.js";
        export default {
            name:"demo2",
          store,
          data(){
            return{
    
            }
          },
          components:{//组件的显示
              child
          },
          computed:{//获取store.js中的数据
              msg(){
                return store.state.testMsg;
              }
          },
          methods:{
              pchangep(){
                store.commit('changeTestMsg','父组件修改自己的文本')
              },
            pchangec(){
              store.commit('changeChildText','父组件子组件的文本')
            }
          }
        }
    </script>
    
    <style scoped>
    .head {
      height: 230px;
      background: pink;
      line-height: 50px;
    }
    </style>
    • 在子组件中:
    <template>
      <div class="foot">
        <div>这是child组件</div>
        <div>
          <button @click="cchangec">改变child的数据</button>
          <button @click="cchangep">改变demo2的数据</button>
        </div>
        <div>childText:{{msg}}</div>
      </div>
    </template>
    
    <script>
      import store from "../store/store.js";
        export default {
          name: "child",
          store,
          data(){
              return{
    
              }
          },
          methods:{
            cchangep(){
              store.commit('changeTestMsg','子组件修改父组件的文本')
            },
            cchangec(){
              store.commit('changeChildText','子组件修改自己的文本')
            }
          },
          computed:{
            msg(){
              return store.state.childText;
            }
          }
        }
    </script>
    
    <style scoped>
    .foot {
      height: 300px;
      line-height: 50px;
      background: skyblue;
    }
    </style>

    部分原文链接:https://blog.csdn.net/x550392236/article/details/80668263

    部分原文链接:https://segmentfault.com/a/1190000012881956

  • 相关阅读:
    linux mysql开启远程链接
    Nginx 下无法读取session 导致 thinkphp验证码错误
    Nginx 开启 path_info功能
    让chrome打开手机网页
    vue 组件和全局组件的注册、使用
    Vue 导入文件import、路径@和.的区别
    vue 打包路径不对设置方法
    id
    Ajax GET 和 POST 的区别
    前端笔试题汇总 2018/12/04 (2)
  • 原文地址:https://www.cnblogs.com/czh64/p/12048431.html
Copyright © 2020-2023  润新知