Vuex的简单实例(3)

vuex之mapState

1)有时候可以能会遇到一个组件里会用到多个state的状态,如果还是用声明计算属性的方式就会有些重复和冗余了,为了解决这个问题VUEX也提供了mapState辅助函数帮助我们生成计算属性,让你少写重复代码。首先,在需要的页面导入mapState

import { mapState } from 'vuex'

computed: mapState({
    isLogin: state => state.isLogin,
    username: state => state.username,
    password: state => state.password
  })

2)修改Home.vue,下面这种方式一样能够显示登录状态用户名与密码

// Home.vue
<template>
  <div class="home">
   登录状态:{{ isLogin }}
    <br />
    用户名:{{ username }} ,你好!
    <br />
    密码:{{ password }}
  </div>
</template>

<script>
import { mapState } from 'vuex'

export default {
	computed: mapState({
	    isLogin: state => state.isLogin,
	    username: state => state.username,
	    password: state => state.password
	  })
	  // computed: mapState(['isLogin', 'username', 'password', 'count']),
};
</script>

<style scoped>
</style>

这里的computed好像被mapState独用了,如果我们想写一个普通的(非mapState里面的)计算属性怎么办?这里就要用到对象展开运算符[…]

<script>
import { mapState } from 'vuex'

export default {
	data(){
		return {
			a: 10,
			b: 20
		}
	}
	computed: {
		sum(){
			return this.a + this.b	
		}
	    ...mapState: {
	    	isLogin: state => state.isLogin,
		    username: state => state.username,
		    password: state => state.password
	    }
	    // ...mapState(['isLogin', 'username', 'password', 'count']),
	  }
};
</script>

在Home.vue的template加上 总和:a + b = {{ sum }}
在这里插入图片描述

Vuex之Getter

1)在store.js中加一个list

// ...
    state: {
      isLogin: false, //登录状态
      username: '', //用户名
      password: '', //密码
      list: [
          { name: '钢铁侠', checked: true },
          { name: '美国队长', checked: false },
          { name: '黑寡妇', checked: true },
          { name: '雷神', checked: false },
          { name: '黑豹', checked: true },
          { name: '蜘蛛侠', checked: true },
      ]
    },
// ...

2)目的是显示checked为true的人员,给store对象添加getters属性

// ...
    getters: {
        showChecked: state => {
            return state.list.filter(item => item.checked)
        }
    },
// ...

3)在Home.vue的computed加一个属性

// ...
<div>
      已签到人员:<br>
      <ul>
        <li v-for="(item, index) in showChecked" :key="index">
          {{item.name}}
        </li>
      </ul>
    </div>
// ...
computed: {
    // 其他代码省略...
    showChecked () {
      return this.$store.getters.showChecked
    }
  }

在这里插入图片描述
3)接下来让它实现点击已签到、未签到显示对应名字,添加showChecked2

// 其他代码省略...
getters: {
        showChecked2: (state) => (checked) => {
            return state.list.filter(item => item.checked === checked)
        },
    },

4)在Home.vue的methods中,提前在created生命周期调用

// template
<div>
  <div>
    <a href="javascript:;" @click="getChecked(true)">已签到</a> |
    <a href="javascript:;" @click="getChecked(false)">未签到</a>
  </div>
  <ul>
    <li v-for="(item, index) in checkList" :key="index">{{item.name}}</li>
  </ul>
</div>

created(){
   this.getChecked(true)
 },
methods: {
	getChecked(checked) {
	      console.log(this.$store.getters.showChecked2(checked));
	      this.checkList = this.$store.getters.showChecked2(checked);
	    }
}

在这里插入图片描述

Vuex之mapGetters

1)mapGetters也是Vuex的一个辅助函数,在store中加list数据测试,上面的代码可以简化成下面这样

// store.js
state : {
	songs: [
	    { name: '黑色毛衣', singer: '周杰伦' },
	    { name: '烟花易冷', singer: '周杰伦' },
	    { name: '爱笑的眼睛', singer: '林俊杰' },
	    { name: '美人鱼', singer: '林俊杰' },
	    { name: '不能说的秘密', singer: '周杰伦' },
	    { name: '一千年以后', singer: '林俊杰' },
	    { name: '七里香', singer: '周杰伦' },
	    { name: '修炼爱情', singer: '林俊杰' },
	]
},
getters: {
    showChecked: state => {
        return state.list.filter(item => item.checked)
    },
    showChecked2: (state) => (checked) => {
        return state.list.filter(item => item.checked === checked)
    },
    showSongs: state => {
        return state.songs.filter(item => item.singer == '周杰伦')
    }, // 返回周杰伦的歌
},
// Home.vue 省略其他代码...
// template
<div>
  <div>周杰伦的歌</div>
  <ul>
    <li v-for="(item, index) in showSongs" :key="index">{{item.name}} - {{item.singer}}</li>
  </ul>
</div>

methods: {
   getChecked(checked) {
     console.log(this.showChecked2(checked));
     this.checkList = this.showChecked2(checked);
   }
}
computed: {
    sum() {
      return this.a + this.b;
    },
    showChecked() {
      return this.showChecked;
    },
    // ...
    ...mapGetters(["showChecked", "showChecked2", "showSongs"])
    // 就直接通过this.showChecked调用
  }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值