面试必问 —— 组件传值(全面)

Posted 鲸渔要加油

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试必问 —— 组件传值(全面)相关的知识,希望对你有一定的参考价值。

文章目录

父传子


一、父传子通过 props 接收

父组件子组件的模板中用动态属性传值
也可以传递一个对象

<children :age="18" v-bind="obj" />

子组件props 接收

props: 
    age: 
        // 规定必须为数值型,否则报错
        type: number,
        // 规定不能为空,否则报错
        default: true,
        // 自定义校验规则
        validator(value) 
        	// 里面返回的 true 才代表通过校验
			return [18, 19, 20].include(value)
		
    



二、父传子通过 $attrs 接收

注意: 如果父组件传递了5个值,而子组件只接收了3个
剩下两个则会在子组件根节点 上面,这就是 propAttrible

默认情况下,非 Propattribute 会直接作用于组件的根节点,又叫做 Attribute 继承

<p> $attrs.age   $attrs.name <p>

禁用 Attribute 继承
inheritAttrs: false

<template>
    <div>
        <p>line1</p>
        <p :title="$attrs.title">XXX</p>
    </div>
</template>

<script>
export default 
    inheritAttrs: false,
    name: 'List',
;
</script>

注意: classstyle 作为 props 的保留属性,不能被 props 接收,也不能通过 inheritAttrs 禁用,就是会作用于组件的根节点



三、$children

可以在父组件里面使用 $childern 拿到子组件的实例对象



四、ref

父组件的子模板里面绑定 ref="名字" 属性
我们可以在父组件的方法里面通过 this.$refs.名字 拿到子组建的实例



子传父


一、$listeners

通过此属性,在子中可以拿到父亲的方法,从而修改父亲的数据
父亲在子组件模板设置的事件触发的方法,子组件都可以拿到,用调用方法并传参的的方式改变父组件的数据 this.$listeners.fn1(123)


二、$parent

可以在子组件的方法里面使用 this.$parent 拿到父组件的实例对象


三、自定义事件

$emit('事件的名字', 传递的参数)
可以在子组件里面使用 this.$emit('')

<button @click='$emit("big")'>扩大</button>

父组件使用 v-on 接收,触发父组件的 bbb 函数
此处的 $event 永远代表传参的第二个参数

<ce-shi @big='bbb($event)'></ce-shi>


兄弟传值


一、事件中心

vue3 已经废弃的用法

兄弟之间传递数据需要通过 事件中心
let hub = new Vue() 来作为 事件中心

传递数据 ,通过一个事件 触发 hub.$emit(名, 传递的数据)

接收数据 ,在 mounted() 钩子中触发 hub.$on(名, (接收的值)=>做的事) 方法

销毁事件 ,在父组件中通过 hub.$off(名) 方法名销毁之后无法进行传递数据



祖先传后代

一、provideinject

在我们的组件的层级套的很复杂的时候使用

无论层级结构多深,祖先组件都可以作为其后代组件依赖(数据)提供者,祖先组件通过 provide 提供数据,后代组件通过 inject 接收数据

// 父组件
provide: 
	name: '大鲸鱼'

// 子组件
inject: ['name']


其他方法

一、localStoragesessionStorage


二、Vuex

以上是关于面试必问 —— 组件传值(全面)的主要内容,如果未能解决你的问题,请参考以下文章

Vue-Cli—04.父子组件传值祖孙组件传值兄弟组件传值

12.组件化开发2-非父子组件之间通信-祖先和后代之间的通信

003.(高级)组件通信

Button按钮--inject与provide

父子组件传值的几种方式

Delphi:写入后代类中的私有祖先字段