vuex 第一节

vuex 是什么?

Vuex 是一个专为 Vue.js 应用程序开发的 状态管理模式,类似 redux
vuex是一个专门为vue.js设计的集中式状态管理架构。状态?我把它理解为在data中的属性需要共享给其他vue组件使用的部分,就叫做状态。简单的说就是data中需要共用的属性。
当项目数据量达到一定程度的时候去使用。 vueX存储数据是存储在内存当中的
这种状态管理模式包含:

  • State : 状态数据源
  • View : 使用状态数据源的视图
  • Actions : 修改更新数据源的操作

这种模式遵循的是 单向数据流 模式
在这里插入图片描述

4、vuex 的工作流

在这里插入图片描述

  • State : 存储应用状态数据(React 中的 State)
  • Vue Component : 消费 State
  • Actions : 提交修改 State 的动作(包括异步行为)(React 中的 action)
  • Mutations : 唯一更改 State 的位置(React 中的 Reducer)

安装 vuex

npm i vuex
// or
yarn add vuex

6、引入 vuex

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

Store

**Store ** 就是仓库,存储数据,我们前面提到的 state 就存储在 store 中,同时提交动作、修改状态的方法也都由 store 提供和管理
Store中的数据也是会被追踪的当数据发生改变会自动渲染页面

创建一个 Store

必须在 Vue.use(Vuex) 之后创建 store

Vue.use(Vuex)
let store = new Vuex.Store({
    state: {},
    getters: {},
    mutations: {},
    actions: {}
})

存储应用状态数据的对象,state 的值可以是一个对象,也可以是一个返回对象的函数,类似 vue 中组件的 data ,使用函数的方式返回对象可以避免对象引用导致的副作用问题

在组件中使用 store

export default new Vuex.Store({//创建仓库并使用导出 可以有多个
  state: { //存储数据  vueX中存储的数据也是会被追踪的当数据发生改变会自动渲染页面    
    tiele:'华山论剑',
    content:"good",
  },
  mutations: {
  },
  // 异步的处理在actions里面处理,然后通过commmit提交给
  actions: {
  },
  modules: {
  },
})

方法1、在组件中使用数据

<template>
  <div class="about">
    <h1>
      {{t}}
    </h1>
    <div>
      {{c}}
    </div>
  </div>
</template>
    computed: { 
    t(){
      return this.$store.state.content
    },
    c(){
      return this.$store.state.tiele
    }

方法2 .数组的方式, 如果数据没有需要处理的可这么写 引入mapState
当一个组件需要获取多个状态时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性,让你少按几次键,通常我们把 storestate 通过 mapState 函数映射到组件的 computed

<template>
  <div class="about">
    <h1>
      {{tiele}}
    </h1>
    <div>
      {{content}}
    </div>
  </div>
</template>
<script>
import {mapState} from 'vuex'
export default {
 
  name :'About',
  data() {
    return {
      val:1
    }
  },
  computed: mapState(['tiele','content']),
}
</script>

3.对象的方式

<script>
import {mapState} from 'vuex'
export default {
  
  name :'About',
  data() {
    return {
      val:1
    }
  },
  computed: {
    result(){ 
      return this.val*10
    },
    ...mapState({ //扩展运算
      tiele:"tiele",
      con:({content})=>{return content.toUpperCase()} //处理的是从state中拿出来的sh
    })
  },

}
</script>

getters

有时候我们需要从 store 中的 state 中派生(计算)出一些状态,类似组件的 datacomputedstore 也提供了一个 getters 对象来处理派生数据
多个组价有共同的需求时我们可以在store/index.js文件中使拥getters方法,在出库之前处理,然后派出使用

getters 函数

与组件属性一样,我们是通过定义一个函数的形式来返回派生数据的,getters 函数接受两个参数

  • 第一个参数:state 对象
  • 第二个参数:getters 对象

案例

点击按钮男/女进行筛选
总体思路:showUsers 通过返回的内容判断自身是什么类型 我们要传数据的话需要返回一个函数
函数体里方法按需 Home页面里showUsers就是一个函数了,我们就为其传参

import Vue from 'vue'
import Vuex from 'vuex'
// import {mapState,mapMutations} from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({//创建仓库并使用导出 可以有多个
  state: { //存储数据  vueX中存储的数据也是会被追踪的当数据发生改变会自动渲染页面
    userGender:'', //这里存储筛选条件,在页面中,改变这里的数据 从而影响发送至页面的数据
    users :[
      {id: 1, username: '小王', gender: '男',checked:false},
      {id: 2, username: '小李', gender: '男',checked:false},
      {id: 3, username: '小张', gender: '男',checked:false},
      {id: 4, username: '小黄', gender: '男',checked:false},
      {id: 5, username: '小花', gender: '女',checked:false},
      {id: 6, username: '小芳', gender: '女',checked:false}
      ]
  },
  getters:{
    // showUsers({users,userGender}){//参数对象state中自动传过来的  1原数据 2怎么筛选 
    //   return ''===userGender ? users : users.filter(user=>user.gender==userGender)
    //   //      如果userGender为空 返所有   否则过滤     user数据的性别 等于userGender的值      
    // },//上面这种方法页面无法传递数据,只能通过代码更改达到过滤
    showUsers({users,userGender}){
      return (userGender ='')=>{
        return ''===userGender ? users : users.filter(user=>user.gender==userGender) 
      }
    },
    // showSort:()=>{ return 123}  等同于 showSort :123
    // showSort:()=>{ return ()->{} } 返回一个函数
  },
  /*
  1:   users :   数组中的数据源渲染到页面
  2.:  getters:   在数据源出门之后,进行派生,派生依赖于一个参数
  3.: 页面控制  派生依赖的参数*/ 
})

Home组件

<template>
  <div class="home">
    <ul>
      <button @click="sex='男'" :class="{'active':sex=='男'}"></button>
      <button @click="sex='女'" :class="{'active':sex=='女'}"></button>
      <li v-for="(user,index) in users" :key="index">
        {{user.username}}
      </li>  
    </ul>   
  </div>
</template>

<script>
export default {
  name: 'Home',
  data() {
    return {
      sex:'',//默认为空
    }
  },
  components: {
    HelloWorld
  },   
  computed: { 
    users(){
      // return this.$store.state.users; //显示原始数据
      return this.$store.getters.showUsers(this.sex); //函数(传递的参数)
    },
  },
}
</script>
<style scoped>
  ul{
    list-style: none;
  }
  .active{
    background:blueviolet;
    color:white;
  }
</style>
  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章