zoukankan      html  css  js  c++  java
  • Vuex

     
    1, 安装   vue add vuex

    2, 安装完之后会自动生成store文件夹,并在main.js中自动引用

    store/index.js

     

    3,在store文件夹下的index.js中定义

    import Vue from 'vue'
    import Vuex from 'vuex'
    Vue.use(Vuex)

    export default new Vuex.Store({
      state: {  
        username:'霍比特人'
      },
      getters:{
       
      },
      mutations: {
       
      },
      actions: {
       
      },
      modules: {
     
      }
    })

     

    4,组件中获取state

     console.log('store中的值 : '+this.$store.state.username);


    <div>{{name}}</div>

     

    注意要放在computed方法中,可以实时变化

     

     computed: {

          name(){

            return this.$store.state.username

          }

        },

     

     

    4.2,辅助函数mapState,能够帮助我们更便捷的获取state

    computed: mapState(["username"]),

     

    5,  Getters  获取并操作属性

    5.1 getters   在原有状态下派生新的状态  

    (1)/store/index.js

    import Vue from 'vue'

    import Vuex from 'vuex'

    Vue.use(Vuex)

    export default new Vuex.Store({

      state: {

        username:'哈哈',

        count:0,

        todos: [

          { id: 1, text: '...', done: true },

          { id: 2, text: '...', done: false }

        ]

      },

      getters:{

        /* 原有基础上派生新的状态 */

        username: state => {

          return state.username+'..new'

        },

        count: state=>{

          return ++state.count

        }

      },

      mutations: {

      },

      actions: {

      },

      modules: {

      }

    })

     

    (2)*.vue

          computed: {

          username(){

            return this.$store.getters.username

          }

        },

     

     

    5.2 getters   在原有状态下过滤派生新的状态

    (1)

     state: {

        username:'哈哈',

        count:0,

        todos: [

          { id: 1, text: '...', completed: true },

          { id: 2, text: '...', completed: false },

          { id: 3, text: '...', completed: true },

          { id: 4, text: '...', completed: false },

          { id: 5, text: '...', completed: true },

        ]

      },

      getters:{

        /* 原有基础上派生新的状态 */

        username: state => {

          return state.username+'..new'

        },

        count: state=>{

          return ++state.count

        },

        completedTodos: state => {

          return state.todos.filter(t=>t.completed)  //filter过滤,得到每一个todo,如果todo.completed为真得到,false则被过滤掉

      //return state.todos.filter(t=>!t.completed)  过滤掉真的

        }

      },

    (2)

                completedTodos(){

            return this.$store.getters.completedTodos

          }

     

    5.3 getters   返回某个新的状态的长度

    getters:{

        completedTodos: state => {

          return state.todos.filter(t=>!t.completed)     

       },

        /* 返回   completedTodos数据为假的个数*/

        completedTodosCount:(state,getters)=>{

          return getters.completedTodos.length

        }

      },

    5.4 getters  通过id找到某个值

    (1)

    import Vue from 'vue'

    import Vuex from 'vuex'

    Vue.use(Vuex)

    export default new Vuex.Store({

      state: {

        todos: [

          { id: 1text: '...'completed: true },

          { id: 2text: '...'completed: false },

          { id: 3text: '...'completed: true },

          { id: 4text: '...'completed: false },

          { id: 5text: '...'completed: true },

        ]

      },

      getters:{

        getTodosById: state => id =>{

          return state.todos.find(t=>t.id===id)

        }

      },

      mutations: {

      },

      actions: {

      },

      modules: {

      }

    })

    (2)

       

      {{getTodosById(1)}}

     

       computed: {

          getTodosById(){

            return this.$store.getters.getTodosById

          }

        },

     

    5.5  getters  简化 

    <div class="f1">{{getTodosById(1)}}</div>

     

    import { mapState,mapGetters } from 'vuex'

    computed: mapGetters(["getTodosById"]),

     

     

    6,Mutations  修改状态  ( Mutation必须是同步,如果用到异步要使用action)

        (1)

    import Vue from 'vue'

    import Vuex from 'vuex'

    Vue.use(Vuex)

    export default new Vuex.Store({

      state: {

         count:0,

      },

      getters:{

      },

      mutations: {

        incrementCount(state){

          return state.count++

        },

        decrementCount(state,n){   

    // n为传递过来的参数 ,

    //在大多数情况下,载荷(n)应该是一个对象,这样可以包含多个字段并且记录的 mutation 会更易读

     

     

          return state.count-=n

        }

      },

      actions: {

      },

      modules: {

      }

    })

    (2)

    <div class="f1">

     

         <button @click="increment">+</button>  

     

         {{count}}  

     

         <button @click="decrement(2)">-</button>

     

    </div>

     

     methods: {

          increment(){

            /* 触发mutation中的方法 */

            this.$store.commit("incrementCount")

          },

          decrement(n){

            this.$store.commit("decrementCount",n)

          }

     },

     

    7,Actions 用来操作mutation,异步修改状态  (Action中主要做数据的请求)

        Action 类似于 mutation,不同在于:

    ·       Action 提交的是 mutation,而不是直接变更状态。

    ·       Action 可以包含任意异步操作。

    (1)操作count

      actions: {

        incrementCountAsync(context){  //context相当于 this.$store

          setTimeout(()=>{

            context.commit("incrementCount")  //提交到mutation

          },2000)

        },

        decrementCountAsync({commit},payload){  // 结构出 commit  ;   payload接收参数

          setTimeout(()=>{

            commit("decrementCount",payload)

          },1000)

        }

      },

     

      ————————————————————

    <div class="f1">

        <button @click="increment">+</button>  

        {{count}}  

         <button @click="decrement(2)">-</button>

    </div>

     

    methods: {

          increment(){

            this.$store.dispatch("incrementCountAsync")

          },

          decrement(n){

            this.$store.dispatch("decrementCountAsync",n)

          }

    },

     

    (2)获取和更新数据

    import Vue from 'vue'

    import Vuex from 'vuex'

    import http from '../http'

    Vue.use(Vuex)

    export default new Vuex.Store({

      state: {

        todos: [

          { id: 1, text: '...', completed: true },

          { id: 2, text: '...', completed: false },

          { id: 3, text: '...', completed: true },

          { id: 4, text: '...', completed: false },

          { id: 5, text: '...', completed: true },

        ]

      },

      getters:{

      },

      mutations: {

        setTodos:(state,n)=>(state.todos=n)   //n为接收的参数 , todos为state中的todos

      },

      actions: {

        async fetchTodos({commit}){

          const res = await http.get('/')

          console.log(res);

          /* 更新数据 */

          commit("setTodos",res.data)

        }

      },

      modules: {

      }

    })

    ————————————————————————

    <div>{{todos}}</div>

     

    <script>

     

    import { mapState,mapGetters } from 'vuex'

     

    export default {

     

        methods: {

          fetchTodos(){

            this.$store.dispatch("fetchTodos")

          }

        },

     

        computed: mapState(["username","count","todos"]),

     

        created() {

             this.fetchTodos()

        },

     

      }

    </script>

     

     

    8,Module 模块化 (将state中对象抽离, 每一个state包含自己的getters,mutations和actionss,从而实现模块化)

    (1)(修改index,js内容)store/index.js

    import Vue from 'vue'

    import Vuex from 'vuex'

    import todos from './modules/todos'

    Vue.use(Vuex)

    export default new Vuex.Store({

      modules: {

        todos

      }

    })

     

    2)(在store目录下创建modules目录,并在modules目录下创建todo,js) store/modules/todos.js

    import http from '../../http'

    const state = {

        todos: [

            { id: 1, text: '...', completed: true },

            { id: 2, text: '...', completed: false },

            { id: 3, text: '...', completed: true },

            { id: 4, text: '...', completed: false },

            { id: 5, text: '...', completed: true },

          ]

    }

    const getters = {

        completedTodos: state => {

            return state.todos.filter(t=>!t.completed)  //filter过滤,得到每一个todo,如果todo.completed为真得到,false则被过滤

        },

        /* 返回   completedTodos数据为假的个数*/

        completedTodosCount:(state,getters)=>{

        return getters.completedTodos.length

        }

    }

    const mutations = {

        setTodos:(state,n)=>(state.todos=n)   //n为接收的参数 , todos为state中的todos

    }

    const actions = {

        async fetchTodos({commit}){

            const res = await http.get('/')

            console.log(res);

            /* 更新数据 */

            commit("setTodos",res.data)

          }

    }

    export default {

        state,

        getters,

        mutations,

        actions

    }

     

     

  • 相关阅读:
    IIS7中的几种身份鉴别方式(一)Basic身份验证
    IIS7中的几种身份鉴别方式(二)集成身份验证
    java集合
    SharePoint 2010中welcome page的设置细节
    SharePoint中使用Linq出现未将对象引用到实例化的解决方法
    SharePoint 2010中关于An error was encountered while retrieving the user profile的处理方式记录
    The Need for an Architectural Body of Knowledge
    The Softer Side of the Architect
    Event Receivers 学习小结
    使用SmtpClient发送带图片的邮件的代码实现
  • 原文地址:https://www.cnblogs.com/500m/p/11876358.html
Copyright © 2011-2022 走看看