美文网首页
多组件共享数据

多组件共享数据

作者: 冰点雨 | 来源:发表于2022-04-14 12:59 被阅读0次
d73b7064865b99842c57e549b7edfc3.png

App.vue

<template>
  <div>
    <Count />
    <hr />
    <Person />
  </div>
</template>

<script>
// 引入组件
import Count from './components/Count'
import Person from './components/Person.vue'

export default {
  name: 'App',
  components: { Count, Person },
}
</script>

index.js

// 该文件用于创建Vuex中最为核心的store
import Vue from 'vue'
//引入vuex
import Vuex from "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中的jian调用了")
    context.commit('JIAODD',value)
   },
  jiaWait(context,value){
  //  console.log("actions中的jian调用了")
    context.commit('JIAWAIT',value)
   }
}
//准备mutations-用于操作数据(state)
const mutations = {
  JIA(state,value){
  //  console.log("mutations中的jia调用了")
    state.sum += value
  },
  JIAN(state,value){
  //  console.log("mutations中的jia调用了")
    state.sum -= value
  },
  JIAODD(state,value){
  //  console.log("mutations中的jia调用了")
    if (state.sum % 2) { 
        state.sum += value
    }
  },
  JIAWAIT(state,value){
  //  console.log("mutations中的jia调用了")
    setTimeout(() => {
       state.sum += value
    }, 500);
  },
  ADD_PERSON (state,value) { 
    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: actions,
  mutations: mutations,
  state: state,
  getters:getters
})

Count.vue

<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 { mapActions, mapGetters, mapMutations, mapState } from 'vuex'
export default {
  name: 'Count',
  data() {
    return {
      n: 1, //用户选择的数字
    }
  },
  computed: {
    // 借用mapState生成计算属性,从state中读取数据(数组写法)
    ...mapState(['sum', 'school', 'subject', 'personList']),

    // 借用mapGetters生成计算属性,从getters中读取数据(数组写法)
    ...mapGetters(['bigSum']),
  },
  methods: {
    ...mapMutations({ increment: 'JIA', decrement: 'JIAN' }),

    /* ************************************************ */
    ...mapActions({ incrementOdd: 'jiaOdd', incrementWait: 'jiaWait' }),
  },
}
</script>

<style>
button {
  margin-left: 10px;
}
</style>

Person.vue

<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'
import { mapState } from 'vuex'
export default {
  name: 'Person',
  computed: {
    ...mapState(['personList', 'sum']),
  },
  methods: {
    add() {
      const personObj = { id: nanoid(), name: this.name }
      this.$store.commit('ADD_PERSON', personObj)
      this.name = ''
    },
  },
}
</script>

<style scoped></style>

相关文章

  • Vue中的组件数据共享问题和非父子组件的通讯

    一.组件数据共享问题 一.父组件向子组件共享数据 props 1.1 父组件向子组件共享数据 1.2 定义一个父组...

  • Vue现代化使用方法(四)--Vuex

    在组件内可以通过data属性共享数据,父子组件也可以通过props进行数据共享,但如果是兄弟跨组件之间的数据共享,...

  • Vuex 基本简单的使用

    适用场景 1.全局共享数据,抛开繁琐的组件传值;2.什么数据适合全局共享?(组件的共享数据);3.好处?(谁要用,...

  • Provider使用记录

    MultiProvider组件 在最顶层组件使用,可以创建多个顶层共享数据. 更改共享数据 点击按钮等方法里,调用...

  • Vuex

    Vuex是为了保存组件之间共享数据而诞生的,如果组件之间有要共享的数据可以直接挂载到vuex中,而不必通过父子组件...

  • Vue组件化开发

    ✍目录总览:(组件化概念、组件注册、数据存放、组件数据共享、组件插槽、使用步骤) 一、组件化概念 1. 组件化开发...

  • flutter状态管理(Provide)

    在前端开发中组件式开发方式往往都是需要用到各组件之间数据,状态的共享,兄弟组件,父子组件数据共享等。在vue中有v...

  • Vuex学习

    1、组件之间共享数据的方式: 父-子:v-bind属性绑定子-父:v-on事件绑定兄弟组件之间共享数据:Event...

  • Vue 学习记录二

    组件化: 动态组件 父子组件 插槽 数据共享(Vuex) Vue Router: 生命周期: Plugin 开发:...

  • vue全家桶(4.1)

    5.状态管理 #5.1.兄弟组件之间共享数据的问题? 首先,我们需要了解下兄弟组件之间如何共享数据的问题 完成下列...

网友评论

      本文标题:多组件共享数据

      本文链接:https://www.haomeiwen.com/subject/inujdrtx.html