Vuex基础?有这篇就够啦

来谈谈Vuex吧

全文总计6300字预计阅读时间25分钟

前言

vuex和路由是同级别的但是vuex简单但是不完全简单【手动狗头】

vuex

专业术语:vuex全局状态共享

人话:就是在这个项目里面的数据(vuex创建的),这些数据是组件啊,分页啊都可以用的,它是共享的…

举个例子:
以前:以前啊有个程序员,有一个git库,他自己开发项目喜欢单干——数据啥都都是自己弄
现在:由于收入太低了,这个程序员就找了一家公司进去做前端了,这个库就变成了多人开发了——前端,后端,测试…

演示

demo

接下来我们来演示一下
创建两个组件
在这里插入图片描述
给点基础的东西

fourcom.vue

<template>
  <div class="four-com">
    <h1>four com</h1>
    <p>{{num}}</p>
    <button @click="num++">num++</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      num: 0,
    };
  },
};
</script>

<style lang="scss" scoped>
.four-com {
  padding: 10px;
  margin: 4px;
  background-color: rgb(23, 82, 82);
}
</style>



threecom.vue

<template>
  <div class="four-com">
    <h1>three com</h1>
    <button @click="num++">num++</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      num: 0,
    };
  },
};
</script>

<style lang="scss" scoped>
.four-com {
  padding: 10px;
  margin: 4px;
  background-color: rgb(23, 82, 82);
}
</style>

App.vue
引入组件

<template>
  <div>
    <three-come/>
    <four-come/>
  </div>
</template>

<script>
import FourCome from './components/FourCome.vue'
import ThreeCome from './components/ThreeCome.vue'
  export default {
  components: { ThreeCome, FourCome },
    
  }
</script>

<style lang="scss" scoped>

</style>

启动之后看结果
在这里插入图片描述

数据互通

看 图/示例 我们发现是可以点击的,但是他们两个数据(data:num)都是一个参数,但是数据不一样这是由于他们两个是不同的组件所以说,数据不会相同,因为两个组件之间的数据树是独立的,所以我们要实现这些数据的互通就要用到Vuex了
在这里插入图片描述

Vuex的实现

Vuex :全局状态管理-组件之间的数据共享

Vuex的配置选项存在src目录下的store文件夹下的index.js里面,里面保存的是Vuex的配置选项,所以找到store目录下的index.js

在这里插入图片描述
打开我们就会发现
在这里插入图片描述
这些对象有些什么意义呢?
在这里插入图片描述

state属性

state

接上回我们说到我们已经完成了创建但是两个组件之间的数据不是互通的所以我们要实现就需要使用Vuex的state属性
在这里插入图片描述
创建一个打印选项打印当前DOM树
在这里插入图片描述
我们来找一下state
在这里插入图片描述
相信到这里了,大家应该知道怎么做了,下面我们来试一下
在这里插入图片描述
找到store目录下的index.js文件在state下面添加一条数据然后我们再去控制台看一下
在这里插入图片描述
现在已经有了数据的,那我们应该怎么使用这些数据呢?
在这里插入图片描述
打印
在这里插入图片描述
既然我们可以看到里面的数据了,举一反三我们像访问num属性就只需要

 console.log(this.$store.state.num);

在这里插入图片描述
所以我们要实现更新的话就可以
在这里插入图片描述
当我们把两个给修改后就可以实现数据互通
在这里插入图片描述
主要修改的代码

<p>{{ $store.state.num }}</p>
    <button @click="$store.state.num++">num++</button>

严格模式与mutations方法

首先再index.js里面开启严格模式

strict:true

位置如图:
在这里插入图片描述
开启严格模式之后我们再去点击按钮就会发现点击之后会报错
在这里插入图片描述
报错代码:

Error in callback for watcher "function () {
    return this._data.$$state;
  }": "Error: [vuex] do not mutate vuex store state outside mutation handlers."

报错翻译:
在这里插入图片描述

这是为什么呢?

这是因为数据是公共的并不是谁都要提交的,也不是谁都能用的所以这就相当于的警察局对枪的监管,
枪是很重要的,所以你想要使用就需要申请/记录/出示证明,数据也是如此,所以严格模式没开启之前就是美国对枪的监管,开启之后就是中国

mutations

mutations:变化:在这个属性中书写用于修改共享数据的方法
固定参数:state:共享数据所在的位置

接下来我们去看一下DOM树
在这里插入图片描述

接下来我们添加一些方法然后我们可以使用commit来调用这些方法

在这里插入图片描述
然后回到App.js添加
在这里插入图片描述
代码:

<template>
  <div>
    <three-come />
    <four-come />
    <div>
      <p>num的值:{{ this.$store.state.num }}</p>
      <button @click="Addnumto">Num++</button>
    </div>
  </div>
</template>

<script>
import FourCome from "./components/FourCome.vue";
import ThreeCome from "./components/ThreeCome.vue";
export default {
  components: { ThreeCome, FourCome },
  mounted() {
    console.log(this);
  },
  methods: {
    Addnumto() {
      // commit 提交
      // 向$state提交生气名字是num++的方法
      this.$store.commit("Addnum");
    },
  },
};
</script>

<style lang="scss" scoped></style>

但是为了方便我们需要实现传参过去怎么办呢
这个时候我们就可以传使用参数

接下来我们来实现登录和退出

index.js添加代码
在这里插入图片描述
App.vue代码
在这里插入图片描述
在这里插入图片描述
代码:

<template>
  <div>
    <three-come />
    <four-come />
    <div>
      <p>num的值:{{ this.$store.state.num }}</p>
      <button @click="Addnumto">Num++</button>
    </div>
    <div>
      <!-- 显示登陆状态 -->
      <p>登陆状态:{{this.$store.state.islogin}}</p>
      <!-- 操作 -->
      <button @click="loginto(true)">登录</button>
      <button @click="loginto(false)">退出</button>
    </div>
  </div>
</template>

<script>
import FourCome from "./components/FourCome.vue";
import ThreeCome from "./components/ThreeCome.vue";
export default {
  components: { ThreeCome, FourCome },
  mounted() {
    console.log(this);
  },
  methods: {
    Addnumto() {
      // commit 提交
      // 向$state提交生气名字是num++的方法
      this.$store.commit("Addnum");
    },
    loginto(x){
      // 传参为X为形参
      console.log(x);
      // 打印显示
      this.$store.commit("Loginto", x);
      // 调用方法
    }
  },
};
</script>

<style lang="scss" scoped></style>

结果:
在这里插入图片描述
and
在这里插入图片描述
现在我们已经实现的方法的使用,但是用它显示的为false和true啊,怎么让他显示登录和未登录呢?【如果在App.vue里面写判断返回的话,不怎么安全】

所以我们可以使用:getters

getters

getters:计算属性 :在已有的数据里判断返回值
固定参数:state:共享数据所在的位置

index.js
在这里插入图片描述
App.vue

在这里插入图片描述
实现:
在这里插入图片描述

在这里插入图片描述
如果传参的话就可以实现很多的操作

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿山同学.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值