Code Monkey home page Code Monkey logo

base-front-exercise's People

Contributors

emilylike avatar

Watchers

 avatar

base-front-exercise's Issues

# Vue 组件通信

Vue组件通信

一、兄弟组件

1.1 兄弟组件通过父组件进行通讯

1.2 兄弟组件通过bus进行通讯

业务场景:

搜索组件参数的改变,需要改变图表组件的参数,并触发图表组件的重载

**技术分析1:**改变图表组件的参数

搜索组件和图表组件属于兄弟组件。但是由于组件嵌套过深,无法通过父组件进行通讯,示意图如下:

A

这里有两种方式:

① 使用Vue中的bus进行通讯

② 通过Vuex进行通讯

我们挨个进行介绍。

首先是通过bus进行通讯,其实这个原理和父子之间通讯的原理差不多,既然无法直接到达父组件,那么,就通过一个新的vue组件去充当两者之间的父组件。从而实现通讯。

示意图如下:

A (1)

原理上如此,但实际上,Root组件本身就可以充当Bus组件。具体做法为,在Bus组件的created钩子函数中将bus指向root组件即可,代码如下:

created() {
		// 兄弟组件之间的总线
    Vue.prototype.$bus = this;
}

然后在搜索组件中,参数改变时,通过emit发出请求,传递参数。

在图标组件中通过on进行接收。代码如下:

// 搜索组件:
clickChange(params){
	// 这里参数传递做简单处理
	this.$bus.$emit('queryChange', params);
}
// 图表组件
created(){
	this.$bus.$on('queryChange', this.paramChange(params));
}

通过vuex的通讯就是按照规则去写就可以了,可参考:https://blog.csdn.net/qq_44166697/article/details/107078415

但是有一个要注意的点是,如果你是按模块写的vuex,并使用了namespaced命名空间,那么在使用getters获得变量,commit改变变量时,记得写模块路径。

举个例子,我们把搜索组件和图表组件需要传递的参数放在了store/modules/component这个路径下,变量的名称是 param。如果我们想要获取param的值,则需要写:

this.store.getters['component/param']

可参考vuex官网namespaced介绍:

Module | Vuex

技术分析2: 图表组件的重载

当时解决这个问题的时候,有一个难点存在。即,图表组件本身具有层级结构:

Basezujm

为了保证扩展性,总线监听的参数param在Base组件中。

因此,在每个单独的组件中,对param的变化进行监听。当监听到param发生变化时,触发reload函数。并通过计算属性将param参数传到对应请求参数中。

// 当param变化的时候,图表组件进行响应
    @Watch('param', { deep: true })
    queryChange() {
      this.reload();
    }

    // 需要合并来自兄弟组件(搜索组件)的param
    get dateQuery() {
      return this.param;
    }

二、父子组件

子组件即时响应父组件属性变化

父组件可以通过prop向子组件传递信息,但是当prop改变的时候,子组件监听不到。原因是,通过prop传过来的属性,在mounted阶段被挂载之后,就监听不到了。

这个时候,可以使用计算属性,直接返回prop,也可以使用watch监听prop

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.