前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《进阶篇第9章》学习vuex知识点后练习:把求和案例改成多组件共享数据

《进阶篇第9章》学习vuex知识点后练习:把求和案例改成多组件共享数据

原创
作者头像
刘大猫
发布2024-10-16 20:54:12
770
发布2024-10-16 20:54:12
举报
文章被收录于专栏:Vue2

@toc

效果展示:

<font color='red'>注意点1:</font>

问题:如何实现“当前和为奇数再加”?

<font color='red'>答案:</font>

代码语言:java
复制
incrementOdd(){
	if(this.sum % 2){
		this.sum += this.n
	}
}

<font color='red'>注意点2:</font>

问题:select下拉框默认为1时,点击加号没问题,但是下拉框选中为2时,n值变成字符串了,不应该是数字类型名吗?

<font color='red'>旧代码:无论设置 value="1"还是 value=1都无效</font>

代码语言:java
复制
<h1>当前求和为:{{sum}}</h1>
<select v-model="n">
	<option value="1">1</option>
	<option value="2">2</option>
	<option value="3">3</option>
</select>

<font color='red'>答案:因为没设置值选中值为数值类型</font>

方式1,使用v-bind

代码语言:java
复制
<h1>当前求和为:{{sum}}</h1>
<select v-model="n">
	<option :value="1">1</option>
	<option :value="2">2</option>
	<option :value="3">3</option>
</select>

方式2,v-model设置修饰符

代码语言:java
复制
<h1>当前求和为:{{sum}}</h1>
<select v-model.number="n">
	<option value="1">1</option>
	<option value="2">2</option>
	<option value="3">3</option>
</select>

9.6求和案例_多组件共享数据

案例说明:有两个组件count和person,在vuex中共享属性sum和personList,在两个平行组件之间显示出来。

完整代码

main.js

代码语言:java
复制
//引入Vue
import Vue from 'vue'
//引入App
import App from './App.vue'
//引入插件
import vueResource from 'vue-resource'
//引入store
import store from './store'

//关闭Vue的生产提示
Vue.config.productionTip = false
//使用插件
Vue.use(vueResource)

//创建vm
new Vue({
	el:'#app',
	render: h => h(App),
	store,
	beforeCreate() {
		Vue.prototype.$bus = this
	}
})

App.vue

代码语言:java
复制
<template>
  <div>
    <Count/>
    <hr>
    <Person/>
  </div>
</template>

<script>
import Count from './components/Count'
import Person from './components/Person'

export default {
  name:'App',
  components:{Count,Person},
  mounted() {
    // console.log('App',this)
  },
}
</script>

Count.vue

代码语言:java
复制
<template>
  <div>
    <h1>当前求和为:{{sum}}</h1>
    <h3>当前求和放大10倍为:{{bigSum}}</h3>
    <h3>我在{{school}},学习{{subject}}</h3>
    <h3 style="color:red">Person组件的总人数是:{{personList.length}}</h3>
    <select v-model.number="n">
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>
    <button @click="increment(n)">+</button>
    <button @click="decrement(n)">-</button>
    <button @click="incrementOdd(n)">当前求和为奇数再加</button>
    <button @click="incrementWait(n)">等一等再加</button>
  </div>
</template>

<script>
import {mapState,mapGetters,mapMutations,mapActions} from 'vuex'
export default {
  name:'Count',
  data() {
    return {
      n:1, //用户选择的数字
    }
  },
  computed:{
    //借助mapState生成计算属性,从state中读取数据。(数组写法)
    ...mapState(['sum','school','subject','personList']),
    //借助mapGetters生成计算属性,从getters中读取数据。(数组写法)
    ...mapGetters(['bigSum'])
  },
  methods: {
    //借助mapMutations生成对应的方法,方法中会调用commit去联系mutations(对象写法)
    ...mapMutations({increment:'JIA',decrement:'JIAN'}),
    //借助mapActions生成对应的方法,方法中会调用dispatch去联系actions(对象写法)
    ...mapActions({incrementOdd:'jiaOdd',incrementWait:'jiaWait'})
  },
  mounted() {
    // const x = mapState({he:'sum',xuexiao:'school',xueke:'subject'})
    // console.log(x)
  },
}
</script>

<style lang="css">
button{
  margin-left: 5px;
}
</style>

Person.vue

代码语言:java
复制
<template>
	<div>
		<h1>人员列表</h1>
		<h3 style="color:red">Count组件求和为:{{sum}}</h3>
		<input type="text" placeholder="请输入名字" v-model="name">
		<button @click="add">添加</button>
		<ul>
			<li v-for="p in personList" :key="p.id">{{p.name}}</li>
		</ul>
	</div>
</template>

<script>
	import {nanoid} from 'nanoid'
	export default {
		name:'Person',
		data() {
			return {
				name:''
			}
		},
		computed:{
			personList(){
				return this.$store.state.personList
			},
			sum(){
				return this.$store.state.sum
			}
		},
		methods: {
			add(){
				const personObj = {id:nanoid(),name:this.name}
				this.$store.commit('ADD_PERSON',personObj)
				this.name = ''
			}
		},
	}
</script>

Index.js

代码语言:java
复制
//该文件用于创建Vuex中最为核心的store
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'
//应用Vuex插件
Vue.use(Vuex)

//准备actions——用于响应组件中的动作
const actions = {
    /* jia(context,value){
        console.log('actions中的jia被调用了')
        context.commit('JIA',value)
    },
    jian(context,value){
        console.log('actions中的jian被调用了')
        context.commit('JIAN',value)
    }, */
    jiaOdd(context,value){
        console.log('actions中的jiaOdd被调用了')
        if(context.state.sum % 2){
            context.commit('JIA',value)
        }
    },
    jiaWait(context,value){
        console.log('actions中的jiaWait被调用了')
        setTimeout(()=>{
            context.commit('JIA',value)
        },500)
    }
}
//准备mutations——用于操作数据(state)
const mutations = {
    JIA(state,value){
        console.log('mutations中的JIA被调用了')
        state.sum += value
    },
    JIAN(state,value){
        console.log('mutations中的JIAN被调用了')
        state.sum -= value
    },
    ADD_PERSON(state,value){
        console.log('mutations中的ADD_PERSON被调用了')
        state.personList.unshift(value)
    }
}
//准备state——用于存储数据
const state = {
    sum:0, //当前的和
    school:'尚硅谷',
    subject:'前端',
    personList:[
        {id:'001',name:'张三'}
    ]
}
//准备getters——用于将state中的数据进行加工
const getters = {
    bigSum(state){
        return state.sum*10
    }
}

//创建并暴露store
export default new Vuex.Store({
    actions,
    mutations,
    state,
    getters
})

结果展示

本人其他相关文章链接

1.《进阶篇第9章》学习vuex知识点后练习:求和案例_纯vue版代码

2.《进阶篇第9章》学习vuex知识点后练习:把求和案例改成vuex版代码

3.《进阶篇第9章》学习vuex知识点后练习:把求和案例改成getters

4.《进阶篇第9章》学习vuex知识点后练习:把求和案例改成mapState与mapGetters

5.《进阶篇第9章》学习vuex知识点后练习:把求和案例改成mapMutations与mapActions

6.《进阶篇第9章》学习vuex知识点后练习:把求和案例改成多组件共享数据

7.《进阶篇第9章》学习vuex知识点后练习:把求和案例改成vuex模块化编码

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 9.6求和案例_多组件共享数据
    • 完整代码
    • 本人其他相关文章链接
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档