Vue组件的传参问题、Vuex的介绍

Vue组件的传参问题

关于vue组件的传参分为父传子(props)和子传父($emit)

这里为大家简单介绍以下如何实现传参
第一种:父传子(props)

props: {
    //父组件传入的item数据
    item: {
      type: Object,
      default: function () {
        return {};
      },
    },
  },

第二种:子传父($emit)

<div class="right" @click="$emit('right-click', $event)">

$emit的第一个参数即自定义的事件名,第二个参数是事件名对应的参数

有了传参,自然也少不了引用父组件和子组件

1、我们通过使用$parent方法来引用父组件

<a href="" @click.prevent="$store.dispatch('logout')">退出</a>

例如:在父组件中定义好了退出登录的方法,就需要在子组件中引用父组件来调用这个方法(如上所示)
2、同理,引用子组件也是一样($ children、$ refs)
注意一点:使用$refs的前提是使用了ref=""去定义过

如何实现跨层级访问数据呢(非父子关系)

上边讲的传参都是在同级情况下进行,想要跨层级实现访问数据,就需要通过创建bus来进行
第一步、创建bus.js文件

//导入Vue
import Vue from "vue"
//创建Vue实例
var bus = new Vue();
//导出bus
export default bus

第二步、在要发送数据的组件中导入bus

import bus from "@/utils/bus.js";

第三步、在有接受数据的组件中导入bus并使用bus.$on(注意this)

created() {
    console.log(this.$children);
    bus.$on("msgchange", ($event) => {
      this.msg = $event;
    });
  },

这里需要注意:任意组件只要导入bus就可以随意的发送与监听数据

bus常用的三个方法
  • bus.$on(eventname,callback)监听事件
  • bus.$emit(eventname,data)发送事件
  • bus.$off(eventname)移除事件
还有一种特殊的依赖注入provider和inject(跨层级访问,只读)
  • provider提供数据,所有子组件都可以通过inject接受数据
  • inject接受父辈提供的数据

Vuex

什么是Vuex

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 + 库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

什么时候我们才使用Vuex呢

Vuex 可以帮助我们管理共享状态,并附带了更多的概念和框架。这需要对短期和长期效益进行权衡。

如果您不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的。确实是如此——如果您的应用够简单,您最好不要使用 Vuex。一个简单的 store 模式就足够您所需了。但是,如果您需要构建一个中大型单页应用,您很可能会考虑如何更好地在组件外部管理状态,Vuex 将会成为自然而然的选择。

使用Vuex的好处

Vuex实现数据全局共享,响应式更新

对于Vuex的解释可以分解为以下几个方面

1、state存放状态
使用的时候通过$store.state.xxx访问

state: {
    //定义user状态(数据)
    user: {
      name: "wzy",
      score: 280
    }
  },

2、mutations改变状态的唯一方法
使用的时候通过$store.commit(“xxx”,data)访问

mutations: {
    //改变数据的唯一方式只能在mutations里面
    //建议方法名大写,默认第一个参数是state
    SET_SCORE(state, data) {
      state.user.score = data;
    }
  },

3、actions异步操作数据的方法
使用的时候通过$store.dispatch(“xxx”,data)访问

actions: {
    //所有针对state异步操作网络请求等放在actions
    changeScore(context, data) {
      setTimeout(() => {
        context.commit("SET_SCORE", data)
      }, 5000)
    }
  },

4、getter从现有的数据计算出新的数据
使用的时候通过$store.getters.xxx访问

getters: {
    //从现有的数据计算出新的数据
    level(state) {
      return (state.user.score / 100).toFixed(1);
    }
  },

5、module子模块
把功能放在store/modules/user.js中

modules: {
    user
  }

为什么要把登录转换到vuex中

  1. 登录后成功的数据可以全局共享
  2. 为了重复利用,登录功能 不可能值在登录页面,如:
    首页点击登录弹框按钮
    购物车,跳转前,弹框登录,登录位置会有很多
    如果写在vuex中,只需要在登录的地方调用$stroe.dispatch(“login”,data)就可以

为什么要写api/login.js实现登录

  1. 重复利用,登录的api也会调用很多次
  2. 方便集中管理所有的请求地址与请求方式api文件中
  3. 改请求方式与参数可以直接修改api内容就可以,不用具体进入到某个组件
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值