当前位置: 代码网 > it编程>编程语言>Javascript > vuex如何修改状态state的方法

vuex如何修改状态state的方法

2024年09月07日 Javascript 我要评论
vuex修改状态state方法vuex想要改变state里的属性,官方推荐的方法是通过mutaion的方式修改state。例如:store.jsconst state = { num:0}const

vuex修改状态state方法

vuex想要改变state里的属性,官方推荐的方法是通过mutaion的方式修改state。

例如:

store.js

const state = {
  num:0
}
const mutations = {
  set_num(state, payload) {
    state.num= payload;
  },
}
export default new vuex.store({
  state,
  mutations
})
<template>
  ...
</template>
<script>
  export default{
    data(){
      return{
        num:1
      }
    },
    methods:{
	  dosomething(){
	    this.$store.commit('set_num',this.num);
	  }	
	}
  }
</script>

在组件里直接修改state也是生效的,例如:

 dosomething(){
   this.$store.state.num = this.num;
 }	

但是不推荐这种直接修改state的方式,因为这样不能使用vuex的浏览器插件来跟踪状态的变化,不利于调试。

vuex state使用/教程/实例

说明

  • 本文用示例介绍vuex的五大核心之一:state。

官网

state概述

单一状态树

  • vuex 使用单一状态树:用一个对象就包含了全部的应用层级状态。它作为一个“唯一数据源。这也意味着,每个应用将仅仅包含一个 store 实例。
  • 单一状态树让我们能够直接地定位任一特定的状态片段,在调试的过程中也能轻易地取得整个当前应用状态的快照。
  • 存储在 vuex 中的数据和 vue 实例中的 data 遵循相同的规则,例如状态对象必须是纯粹 (plain) 的。

响应式

state存放的数据是响应式的:如果store的数据改变,依赖这个数据的组件也会更新。

用法

直接使用

// 在js中使用
this.$store.state.变量名        // 不分模块
this.$store.state.模块名.变量名 // 分模块//在模板上使用
$store.state.变量名        // 不分模块
$store.state.模块名.变量名 // 分模块

mapstate

import { mapstate } from 'vuex'
export default {
    computed: {
        ...mapstate(['state属性名'])              // 不分模块,不修改属性名
        ...mapstate({'新属性名称':'state属性名'}) // 不分模块,修改属性名
        ...mapstate('模块名', ['state属性名'])    // 分模块,不修改属性名
    }
}

示例

代码

couterstore.js

import vue from 'vue';
import vuex from 'vuex';vue.use(vuex);
const counterstore = new vuex.store(
    {
        state: {
            count: 10
        },
    }
);export default counterstore;

parent.vue

<template>
  <div class="outer">
    <h3>父组件</h3>
    <component-b></component-b>
  </div>
</template><script>
import componentb from "./componentb";export default {
  name: 'parent',
  components: {componentb},
}
</script><style scoped>
.outer {
  margin: 20px;
  border: 2px solid red;
  padding: 20px;
}
</style>

componentb.vue(组件)

<template>
  <div class="container">
    <h3>componentb</h3>
    计数器的值:{{thiscount}}
    <!--也可以这么写:-->
    <!--计数器的值:{{this.$store.state.count}}-->
  </div>
</template><script>
export default {
  computed:{
    thiscount() {
      return this.$store.state.count;
    }
  }
}
</script><style scoped>
.container {
  margin: 20px;
  border: 2px solid blue;
  padding: 20px;
}
</style>

路由(router/index.js)

import vue from 'vue'
import router from 'vue-router'
import parent from "../components/parent";vue.use(router)export default new router({
  routes: [
    {
      path: '/parent',
      name: 'parent',
      component: parent,
    }
  ],
})

测试

访问:http://localhost:8080/#/parent

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com