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

    }

     

     

  • 相关阅读:
    几道算法题及学java心得
    css入门
    关于 移动端整屏切换专题 效果的思考
    css3实现卡牌旋转与物体发光效果
    九方格抽奖插件
    绑定弹窗事件最好的方法,原生JS和JQuery方法
    整屏滚动效果 jquery.fullPage.js插件+CSS3实现
    自定义 页面滚动条
    有趣的HTML5 CSS3效果
    CSS3 过渡与动画
  • 原文地址:https://www.cnblogs.com/500m/p/11876358.html
Copyright © 2011-2022 走看看