114.【Vue-细刷-05】(二)

简介: 114.【Vue-细刷-05】

3.求和案列_Vuex

(1).初始化状态

安装vuex: 如果是vue2那么就要安装下面的vue@3

假如安装的不是这个版本就会发现:不存在$store

npm install vuex@3

  1. 搭建环境

  1. 我们引入vue目的是为了使用Vue.use()。引入我们刚才下载的vuex。然后应用Vuex。再然后创建store。最后抛出 store。

store.js

import  Vue  from 'vue'  // 目的是调用: use()
import Vuex from 'vuex' // 引入插件vuex
Vue.use(Vuex)  // 应用Vuex
// TODO: 创建Store 用于管理: state对象、mutations对象
const store=new Vuex.Store()
// TODO: 抛出store
export default store
  1. 我们这里的任务需要引入vuex。然后利用使用store.js创建的store。

main.js

import Vue from 'vue'  // 引入阉割版本的vue
import App from './App.vue' // 引入App.vue组件
import store from './vuex/store'  // 引入vuex
Vue.config.productionTip = false;
new Vue({
    store: store, // TODO: 这里只有当我们应用了vuex才会被Vue自动管理。 --> store.js--->Vue.use()
    render: h => h(App)
}).$mount('#app');

查看组件的vc

2.初始化状态

App.vue

<template>
  <div>
    <Count/>
  </div>
</template>
<script>
import Count from './components/Count.vue'
export default {
  name:'App',
  components:{
    Count,
  }
}
</script>
<style>
</style>

store.js

就是初始化变量
// 初始化状态->需要写成一个对象,要管理n多个组件的状态
const state_jsxs = {
    sum: 0,
}
就是响应的操作
// 创建一个actions,值为一个对象,包含n个响应组件"动作"的函数
const actions_jsxs = {
    jia(a, b) {
        console.log(a, b);
    }
}
传送到我们创建的store。 且下面的两个属性不能变。固定的
// TODO: 创建Store 用于管理: state对象、mutations对象
const store = new Vuex.Store({
    state: state_jsxs,
    actions: actions_jsxs
})
import Vue from 'vue'  // 目的是调用: use()
import Vuex from 'vuex' // 引入插件vuex
Vue.use(Vuex)  // 应用Vuex
// 初始化状态->需要写成一个对象,要管理n多个组件的状态
const state_jsxs = {
    sum: 0,
}
// 创建一个actions,值为一个对象,包含n个响应组件"动作"的函数
const actions_jsxs = {
    jia(a, b) {
        console.log(a, b);
    }
}
// TODO: 创建Store 用于管理: state对象、mutations对象
const store = new Vuex.Store({
    state: state_jsxs,
    actions: actions_jsxs
})
// TODO: 抛出store
export default store

main.js

import Vue from 'vue'  // 引入阉割版本的vue
import App from './App.vue' // 引入App.vue组件
import store from './vuex/store'  // 引入vuex
Vue.config.productionTip = false;
const vm=new Vue({
    store: store, // TODO: 这里只有当我们应用了vuex才会被Vue自动管理。 --> store.js--->Vue.use()
    render: h => h(App)
}).$mount('#app');
console.log('vm',vm)

count.vue

获取$store中我们存的数据
<h2>当前求和未: {{ $store.state.sum }}</h2>
<template>
  <div>
    <h2>当前求和未: {{ $store.state.sum }}</h2>
    <!-- v-model.number意思是: 我们接受到的数据是数值 -->
    <select name="" id="" v-model.number="n">
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>&nbsp;
    <button @click="increment">+</button>&nbsp;
    <button >-</button>&nbsp;
    <button >奇数再加</button>&nbsp;
    <button >异步加</button>&nbsp;
  </div>
</template>
<script>
export default {
  name: "Count",
  data() {
    return {
      n: 1, //
    };
  },
  methods: {
    increment() {
      this.sum += this.n;
    },
  },
  mounted() {
    console.log('vc',this)
  },
};
</script>
<style>
</style>

(2).操作状态

App.vue

<template>
  <div>
    <Count/>
  </div>
</template>
<script>
import Count from './components/Count.vue'
export default {
  name:'App',
  components:{
    Count,
  }
}
</script>
<style>
</style>

store.js

1.设置状态 2.设置响应 3.设置加工状态
import Vue from 'vue'  // 目的是调用: use()
import Vuex from 'vuex' // 引入插件vuex
Vue.use(Vuex)  // 应用Vuex
// 初始化状态->需要写成一个对象,要管理n多个组件的状态
const state_jsxs = {
    sum: 0,
}
// 创建一个actions,值为一个对象,包含n个响应组件"动作"的函数---> 可以拿到分发的值
const actions_jsxs = {
    jia(context, value) { // context 是一个迷你版的$store。我们要用context.commit()去通知mutations加工状态。 value是分发传递的值
        context.commit('JIA_jsxs',value);  // 通知mutations去
        console.log(context, value);
    },
    Async_jia(context,value){
        setTimeout(() =>{
            context.commit('Async_jsxs',value);
        },500)
    },
    describe_jia(context,value){
        context.commit('describe_jsxs',value);
    },
    incrementOdd_jia(context,value){
        context.commit('incrementOdd_jsxs',value);
    }
}
//  加工状态:  这里可以拿到状态设定的值
const mutations_jsxs={
    JIA_jsxs(state_1,value){ // Todo: 这里的第一个参数是是一个对象里面可以获取state状态(),value是分发传递的值
       state_1.sum+=value
    },
    Async_jsxs(state_2,value){
        state_2.sum+=value
    },
    describe_jsxs(state_3,value){
        state_3.sum-=value
    },
    incrementOdd_jsxs(state_4,value){
        if(state_4.sum%2){
            state_4.sum+=value;
        }
    }
}
// TODO: 创建Store 用于管理: state对象、mutations对象
const store = new Vuex.Store({
    state: state_jsxs,
    actions: actions_jsxs,
    mutations:mutations_jsxs
})
// TODO: 抛出store
export default store

main.js

1. 传入 $store
• 1
import Vue from 'vue'  // 引入阉割版本的vue
import App from './App.vue' // 引入App.vue组件
import store from './vuex/store'  // 引入vuex
Vue.config.productionTip = false;
const vm=new Vue({
    store: store, // TODO: 这里只有当我们应用了vuex才会被Vue自动管理。 --> store.js--->Vue.use()
    render: h => h(App)
}).$mount('#app');
console.log('vm',vm)

count.vue

1. 设置分发
<template>
  <div>
    <h2>当前求和未: {{ $store.state.sum }}</h2>
    <!-- v-model.number意思是: 我们接受到的数据是数值 -->
    <select name="" id="" v-model.number="n">
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>&nbsp;
    <button @click="increment">+</button>&nbsp;
    <button @click="describe">-</button>&nbsp;
    <button @click="incrementOdd">奇数再加</button>&nbsp;
    <button @click="incrementAsyn">异步加</button>&nbsp;
  </div>
</template>
<script>
export default {
  name: "Count",
  data() {
    return {
      n: 1, //
    };
  },
  methods: {
    increment() {
      this.$store.dispatch('jia',this.n)
    },
    incrementAsyn(){
      this.$store.dispatch('Async_jia',this.n)
    },
    describe(){
      this.$store.dispatch('describe_jia',this.n)
    },
    incrementOdd(){
      this.$store.dispatch('incrementOdd_jia',this.n)
    }
  },
  mounted() {
    console.log('vc',this)
  },
};
</script>
<style>
</style>

4.求和案列_Vuex的getters

我们的vc管理的store中有一个getters

(1).Vuex的getters类似于 Vue的computed
<template>
  <div>
    <Count/>
  </div>
</template>
<script>
import Count from './components/Count.vue'
export default {
  name:'App',
  components:{
    Count,
  }
}
</script>
<style>
</style>

store.js

// getters中配置的是state经过加工后的值--- 类似于Vue中的computed
const getters_jsxs = {
    // TODO: 必须需要是返回值
    demo(state_5, value) {  // 第一个参数是: $state。第二个参数是传递过来的值。
        return state_5.sum*100
    }
}
// TODO: 创建Store 用于管理: state对象、mutations对象
const store = new Vuex.Store({
    state: state_jsxs,
    actions: actions_jsxs,
    mutations: mutations_jsxs,
    getters:getters_jsxs
})
import Vue from 'vue'  // 目的是调用: use()
import Vuex from 'vuex' // 引入插件vuex
Vue.use(Vuex)  // 应用Vuex
// 初始化状态->需要写成一个对象,要管理n多个组件的状态
const state_jsxs = {
    sum: 0,
}
// 创建一个actions,值为一个对象,包含n个响应组件"动作"的函数---> 可以拿到分发的值
const actions_jsxs = {
    jia(context, value) { // context 是一个迷你版的$store。我们要用context.commit()去通知mutations加工状态。 value是分发传递的值
        context.commit('JIA_jsxs', value);  // 通知mutations去
        console.log(context, value);
    },
    Async_jia(context, value) {
        setTimeout(() => {
            context.commit('Async_jsxs', value);
        }, 500)
    },
    describe_jia(context, value) {
        context.commit('describe_jsxs', value);
    },
    incrementOdd_jia(context, value) {
        context.commit('incrementOdd_jsxs', value);
    },
}
//  加工状态:  这里可以拿到状态设定的值
const mutations_jsxs = {
    JIA_jsxs(state_1, value) { // Todo: 这里的第一个参数是是一个对象里面可以获取state状态(),value是分发传递的值
        state_1.sum += value
    },
    Async_jsxs(state_2, value) {
        state_2.sum += value
    },
    describe_jsxs(state_3, value) {
        state_3.sum -= value
    },
    incrementOdd_jsxs(state_4, value) {
        if (state_4.sum % 2) {
            state_4.sum += value;
        }
    }
}
// getters中配置的是state经过加工后的值--- 类似于Vue中的computed
const getters_jsxs = {
    // TODO: 必须需要是返回值
    demo(state_5, value) {  // 第一个参数是: $state。第二个参数是传递过来的值。
        return state_5.sum*100
    }
}
// TODO: 创建Store 用于管理: state对象、mutations对象
const store = new Vuex.Store({
    state: state_jsxs,
    actions: actions_jsxs,
    mutations: mutations_jsxs,
    getters:getters_jsxs
})
// TODO: 抛出store
export default store

Count.vue

<h2>乘以100之后: {{$store.getters.demo}}</h2>
<template>
  <div>
    <h2>当前求和未: {{ $store.state.sum }}</h2>
    <h2>乘以100之后: {{$store.getters.demo}}</h2>
    <!-- v-model.number意思是: 我们接受到的数据是数值 -->
    <select name="" id="" v-model.number="n">
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>&nbsp;
    <button @click="increment">+</button>&nbsp;
    <button @click="describe">-</button>&nbsp;
    <button @click="incrementOdd">奇数再加</button>&nbsp;
    <button @click="incrementAsyn">异步加</button>&nbsp;
  </div>
</template>
<script>
export default {
  name: "Count",
  data() {
    return {
      n: 1, //
    };
  },
  methods: {
    increment() {
      this.$store.dispatch('jia',this.n)
    },
    incrementAsyn(){
      this.$store.dispatch('Async_jia',this.n)
    },
    describe(){
      this.$store.dispatch('describe_jia',this.n)
    },
    incrementOdd(){
      this.$store.dispatch('incrementOdd_jia',this.n)
    }
  },
  mounted() {
    console.log('vc',this)
  },
};
</script>
<style>
</style>

我们要注意的是: 这里的 getters的一个对象。里面的的对象需要时函数。并且getters和state是同级的,

结果

5.求和案列_Vuex中的mapSteat和mapGetters

我们的的count.vue调用总和的的时候很麻烦,我们想办法优化一下

(1).靠自己写优化
<h2>当前求和未: {{ sum }}</h2>
    <h2>乘以100之后: {{beiSum}}</h2>
 computed:{
    // 自己计算属性:  靠state
    sum(){
        return this.$store.state.sum
    },
    // 自己计算属性:  靠getters
    beiSum(){
      return this.$store.getters.demo
    }
  },
<template>
  <div>
    <h2>当前求和未: {{ sum }}</h2>
    <h2>乘以100之后: {{beiSum}}</h2>
    <!-- v-model.number意思是: 我们接受到的数据是数值 -->
    <select name="" id="" v-model.number="n">
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>&nbsp;
    <button @click="increment">+</button>&nbsp;
    <button @click="describe">-</button>&nbsp;
    <button @click="incrementOdd">奇数再加</button>&nbsp;
    <button @click="incrementAsyn">异步加</button>&nbsp;
  </div>
</template>
<script>
export default {
  name: "Count",
  data() {
    return {
      n: 1, //
    };
  },
  computed:{
    // mapState生成计算属性
    // 自己计算属性
    sum(){
        return this.$store.state.sum
    },
    beiSum(){
      return this.$store.getters.demo
    }
  },
  methods: {
    increment() {
      this.$store.dispatch('jia',this.n)
    },
    incrementAsyn(){
      this.$store.dispatch('Async_jia',this.n)
    },
    describe(){
      this.$store.dispatch('describe_jia',this.n)
    },
    incrementOdd(){
      this.$store.dispatch('incrementOdd_jia',this.n)
    }
  },
  mounted() {
    console.log('vc',this)
  },
};
</script>
<style>
</style>

(2). 利用mapState和mapGetter

main.js

// 初始化状态->需要写成一个对象,要管理n多个组件的状态
const state_jsxs = {
    sum: 0,
    name: 'jsxs'
}
// getters中配置的是state经过加工后的值--- 类似于Vue中的computed
const getters_jsxs = {
    // TODO: 必须需要是返回值
    demo(state_5, value) {  // 第一个参数是: $state。第二个参数是传递过来的值。
        return state_5.sum*100
    }
}
import Vue from 'vue'  // 引入阉割版本的vue
import App from './App.vue' // 引入App.vue组件
import store from './vuex/store'  // 引入vuex
Vue.config.productionTip = false;
const vm=new Vue({
    store: store, // TODO: 这里只有当我们应用了vuex才会被Vue自动管理。 --> store.js--->Vue.use()
    render: h => h(App)
}).$mount('#app');
console.log('vm',vm)

store.js

import Vue from 'vue'  // 目的是调用: use()
import Vuex from 'vuex' // 引入插件vuex
Vue.use(Vuex)  // 应用Vuex
// 初始化状态->需要写成一个对象,要管理n多个组件的状态
const state_jsxs = {
    sum: 0,
    name: 'jsxs'
}
// 创建一个actions,值为一个对象,包含n个响应组件"动作"的函数---> 可以拿到分发的值
const actions_jsxs = {
    jia(context, value) { // context 是一个迷你版的$store。我们要用context.commit()去通知mutations加工状态。 value是分发传递的值
        context.commit('JIA_jsxs', value);  // 通知mutations去
        console.log(context, value);
    },
    Async_jia(context, value) {
        setTimeout(() => {
            context.commit('Async_jsxs', value);
        }, 500)
    },
    describe_jia(context, value) {
        context.commit('describe_jsxs', value);
    },
    incrementOdd_jia(context, value) {
        context.commit('incrementOdd_jsxs', value);
    },
}
//  加工状态:  这里可以拿到状态设定的值
const mutations_jsxs = {
    JIA_jsxs(state_1, value) { // Todo: 这里的第一个参数是是一个对象里面可以获取state状态(),value是分发传递的值
        state_1.sum += value
    },
    Async_jsxs(state_2, value) {
        state_2.sum += value
    },
    describe_jsxs(state_3, value) {
        state_3.sum -= value
    },
    incrementOdd_jsxs(state_4, value) {
        if (state_4.sum % 2) {
            state_4.sum += value;
        }
    }
}
// getters中配置的是state经过加工后的值--- 类似于Vue中的computed
const getters_jsxs = {
    // TODO: 必须需要是返回值
    demo(state_5, value) {  // 第一个参数是: $state。第二个参数是传递过来的值。
        return state_5.sum*100
    }
}
// TODO: 创建Store 用于管理: state对象、mutations对象
const store = new Vuex.Store({
    state: state_jsxs,
    actions: actions_jsxs,
    mutations: mutations_jsxs,
    getters:getters_jsxs
})
// TODO: 抛出store
export default store

Count.vue

<h2>当前求和未: {{ sum_t }}</h2>
    <h2>乘以100之后: {{beiSum}}</h2>
    <h2>名字是: {{usernames}}</h2>
// Todo: 这里需要使用到{}
import {mapGetters, mapState} from 'vuex'
  computed:{
    // 为什么要用三个点,目的是把mapState给摊开。为什么要摊开,因为不能有 { {} }
    ...mapState({
      sum_t:'sum',  // 第一个是现在页面调用的,第二个是store区域的state
      usernames:'name'
    }),
    ...mapGetters({
      beiSum:'demo'  //第一个参数是现在页面调用的,第二个是getters区域的
    })
  },
<template>
  <div>
    <h2>当前求和未: {{ sum_t }}</h2>
    <h2>乘以100之后: {{beiSum}}</h2>
    <h2>名字是: {{usernames}}</h2>
    <!-- v-model.number意思是: 我们接受到的数据是数值 -->
    <select name="" id="" v-model.number="n">
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>&nbsp;
    <button @click="increment">+</button>&nbsp;
    <button @click="describe">-</button>&nbsp;
    <button @click="incrementOdd">奇数再加</button>&nbsp;
    <button @click="incrementAsyn">异步加</button>&nbsp;
  </div>
</template>
<script>
// Todo: 这里需要使用到{}
import {mapGetters, mapState} from 'vuex'
export default {
  name: "Count",
  data() {
    return {
      n: 1, //
    };
  },
  computed:{
    // 为什么要用三个点,目的是把mapState给摊开。为什么要摊开,因为不能有 { {} }
    ...mapState({
      sum_t:'sum',
      usernames:'name'
    }),
    ...mapGetters({
      beiSum:'demo'
    })
  },
  methods: {
    increment() {
      this.$store.dispatch('jia',this.n)
    },
    incrementAsyn(){
      this.$store.dispatch('Async_jia',this.n)
    },
    describe(){
      this.$store.dispatch('describe_jia',this.n)
    },
    incrementOdd(){
      this.$store.dispatch('incrementOdd_jia',this.n)
    }
  },
};
</script>
<style>
</style>

相关文章
|
3天前
|
JavaScript
vue使用iconfont图标
vue使用iconfont图标
34 1
|
14天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
2月前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
44 1
vue学习第一章
|
2月前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
32 1
|
2月前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
39 1
vue学习第四章
|
2月前
|
JavaScript 前端开发 算法
vue学习第7章(循环)
欢迎来到瑞雨溪的博客,一名热爱JavaScript和Vue的大一学生。本文介绍了Vue中的v-for指令,包括遍历数组和对象、使用key以及数组的响应式方法等内容,并附有综合练习实例。关注我,将持续更新更多优质文章!🎉🎉🎉
30 1
vue学习第7章(循环)
|
2月前
|
JavaScript 前端开发
vue学习第九章(v-model)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生,自学前端2年半,正向全栈进发。此篇介绍v-model在不同表单元素中的应用及修饰符的使用,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
33 1
vue学习第九章(v-model)
|
2月前
|
JavaScript 前端开发 开发者
vue学习第十章(组件开发)
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文深入讲解Vue组件的基本使用、全局与局部组件、父子组件通信及数据传递等内容,适合前端开发者学习参考。持续更新中,期待您的关注!🎉🎉🎉
47 1
vue学习第十章(组件开发)
|
2月前
|
JavaScript 前端开发
vue学习第十一章(组件开发2)
欢迎来到我的博客,我是瑞雨溪,一名自学前端两年半的大一学生,专注于JavaScript与Vue。本文介绍Vue中的插槽(slot)使用方法,包括基本插槽、具名插槽及作用域插槽,帮助你在组件开发中实现内容的灵活定制。如果你觉得有帮助,请关注我,持续更新中!🎉🎉🎉
24 1
vue学习第十一章(组件开发2)
|
2月前
|
监控 JavaScript 前端开发
vue学习第十二章(生命周期)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。本文深入探讨了Vue实例的生命周期,从初始化到销毁各阶段的关键钩子函数及其应用场景,帮助你更好地理解Vue的工作原理。如果你觉得有帮助,欢迎关注我,将持续分享更多优质内容!🎉🎉🎉
33 1
vue学习第十二章(生命周期)

热门文章

最新文章