组件传值 (Vue2、Vue3、React)

目录

Vue2

父子组件传值

 props写法

兄弟传值

ref 传值

插槽传值   

匿名插槽

具名插槽

Vue3

父向子组件传值

子向父组件传值

兄弟组件传值

跨组件通信

React

父传子值

函数式子组件

类式子组件

子向父传值

兄弟传值

跨组件通信


Vue2

父子组件传值

黄色 子传父   红色   父传子

 props写法

数组写法       好处  方便 写的少

props: ["msg"]

对象写法       好处   严谨  规定类型 必要性 指定默认值 

props:{
	msg:{
		type:Number,         //限制类型
        require:true,        //限制必要性
		default:function(){  //指定默认值
			return {}
		}
	}
}

兄弟传值

在src文件中 新建utils文件 里创建 eventbus文件夹 内创建eventbus.js

import Vue from 'vue'
export default new Vue()

发送数据

import eventbus from 'eventbus.js'

eventbus .$emit('自定义事件名', 传递的数据)

接收数据

import eventbus from './eventBus.js'

eventbus .$on('自定义事件名', val => {
  console.log(val)   //val数据
})

ref 传值

子组件
<mySon ref="aa"></mySon>

父组件中
this.$refs.aa    即可获取其组件中的所有数据

插槽传值   

v-slot可简写为  #

匿名插槽

父组件中
<son>1111111111</son>

子组件中
添加<slot></slot>   即可将 1111111111 在子组件的slot标签中获取

具名插槽

父组件中
<son>
    <template #hh>
    	<h1>我是头部</h1>
    </template>
    <template v-slot:ff>
    	<h1>我是底部</h1>
    </template>
</son>

子组件中
<header><slot name="hh"></slot></header> //头部就可以单独传过来   我是头部
<footer><slot name="ff"></slot></footer> //底部也可以单独调用了   我是底部

插槽子传父值

在子元素中
<slot name="center" :aa="num"></slot>  /具名插槽
<slot :aa="num"></slot>                /匿名插槽
data(){
return:{
num:1
}}

在父级中接收
<son>
	<template #center="{{aa}}"></template>	  //具名插槽
	<template #default="scoped"></template>	  //匿名插槽   scoped需要解构 {{aa}}
</son>

Vue3

父向子组件传值

父组件
<son msg:"我是父组件传给子组件的信息">

子组件
<script setup>
    let props=defineProps({
        msg:{
            type:String,     // 数据类型
            default:"",      // 默认值
            required:true    // 验证
        }
    })
</script>

子向父组件传值

//父
<son @sendMsg="fn"></son>
<script setup>
    let fn = val => {
        console.log(val)    //拿到数据
    }
</script>

//子组件
<script setup>
    let send_to_father='我知道了'
    let emit=defineEmits(['sendMsg'])    //通过 update 声明此时修改的是 父传过来的变量
    function fn(){
        emit("sendMsg",send_to_father)
    }
</script>

兄弟组件传值

下载 npm i mitt 或者 yarn add mitt

在src中新建util文件加 在新建 bus.js 内容为:

import mitt from "mitt"// 引入 mitt
const bus = new mitt()// 创建bus对象
export default bus// 默认导出bus 

发送数据

import bus from "../../util/bus";
function sendToxq() {
    // emit() 一定要自定义一个事件
    // emit(自动义事件的名称,传的值)
    bus.emit("sendMsg", onOff.value);// 给兄弟组件发消息
}

接受数据

import bus from "./util/bus";
onMounted(()=>{
    bus.on("sendMsg",(val)=>{
        aa.value=val//将传过来的值赋给aa
    })
})

跨组件通信

<template>
    <div>
        爷爷辈
        <father></father>
    </div>
</template>

<script setup>
import father from './father.vue'
    let say=ref("孙子我是你爷爷")
    provide("msg",say)                //传输数据
</script>
<template>
    <div>
        父辈
        <son></son>
    </div>
</template>

<script setup>
import son from './son.vue'
</script>
<template>
    <div>
        儿子辈
        我收到爷爷给我的值  <mark>{{ say }}</mark>
    </div>
</template>

<script setup>
    let say=inject("msg")    //接受到数据
</script>

React

父传子值

父组件
class App extends React.Component {
  state = {
    msg: "我是父传子的数据",
  };
  render() {
    return (
      <div>
        父组件
        <Son aa={this.state.msg} />
      </div>
    );
  }
}

函数式子组件

function Son(props) {
  const { aa } = props;
  return (
    <div>
      我是函数式子组件 父组件传值为<mark>{aa}</mark>
    </div>
  );
}

类式子组件

class SonC extends React.Component {
  render() {
    return (
      <div>
        我是类子组件 父组件传值为<mark>{this.props.aa}</mark>
      </div>
    );
  }
}

子向父传值

子组件
function Son(props) {
  let { Msg } = props;
  function clickHeader() {
    let sonMsg = "这是来自子组件的数据";
    Msg(sonMsg);
  }
  return (
    <div>
      this is son <button onClick={clickHeader}>按钮</button>
    </div>
  );
}
父组件
import React from "react";
class App extends React.Component {
  sendMsg = val => {
    console.log(val);
  };
  render() {
    return (
      <div>
        <Son Msg={this.sendMsg} />
      </div>
    );
  }
}

兄弟传值

兄弟传值 B传递给A

1 先把B中的数据 通过子传父

2 在用 父传子 给A

function SonA({ sendMsg }) {
  return <div>this is A 收到的数据为{sendMsg}</div>;
}
function SonB({ Msg }) {
  let bMsg = "B的数据";
  return (
    <div>
      this is B<button onClick={() => Msg(bMsg)}>按钮</button>
    </div>
  );
}
父组件
class App extends React.Component {
  state = {
    sendMsg: "",
  };
  getMsg = val => {
    console.log(val);
    this.setState({
      sendMsg: val,
    });
  };
  render() {
    return (
      <div>
        <SonA sendMsg={this.state.sendMsg}></SonA>
        <SonB Msg={this.getMsg}></SonB>
      </div>
    );
  }
}

跨组件通信

APP --> A --> C

import React, { createContext } from "react";
const { Provider, Consumer } = createContext();
function ComC() {
  return (
    <div>
      this is C<Consumer>{value => <span>{value}</span>}</Consumer>
    </div>
  );
}
function ComA() {
  return (
    <div>
      this is A
      <ComC />
    </div>
  );
}
class App extends React.Component {
  state = {
    msg: "APP传的值",
  };
  render() {
    return (
      <Provider value={this.state.msg}>
        <div>
          <ComA></ComA>
        </div>
      </Provider>
    );
  }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值