react组件使用props实现预配置插槽

本文详细介绍了在 React 中如何使用 `props.children` 和 `props.render` 实现类似 Vue 中 slot 的功能。通过 `props.children`,可以将内容动态传入组件内部,但无法传递数据给子组件;而 `props.render` 则允许通过函数返回一个组件,从而传递数据和渲染结构。文中提供了具体的代码示例,展示了如何在不同场景下灵活运用这两种方法。

react组件使用props实现预配置插槽

如何向组件内部动态传入带内容的结构(标签)?
Vue中: 
	使用slot技术, 也就是通过组件标签体传入结构  <A><B/></A>
React中:
	使用children props: 通过组件标签体传入结构
	使用render props: 通过组件标签属性传入结构,而且可以携带数据,一般用render函数属性
children props
<A>
  <B>xxxx</B>
</A>
{this.props.children}
问题: 如果B组件需要A组件内的数据, ==> 做不到 

children props例子:

import React, { Component } from 'react'
import "./index.css"
export default class Parent extends Component {
    render() {
        return (
            <div className='parent'>
                <h1>parent页面</h1>

                {/*自闭和组件*/}
                {/* <A /> */}
                {/*不是自闭和组件,传入标签体内容,这样的话在子组件A中就可以通过props的children属性就可以拿到标签体内容 子组件的props:{children: "hello"} */}
                {/* <A x={2}>hello</A> */}
                <A>
                    <B />
                </A>
            </div>
        )
    }
}

class A extends Component {
    render() {
        console.log(this.props); //{x: 2, child: hello}
        return (
            <div className='child'>
                <h1>我是A组件</h1>
                {/* 拿到父组件中的A组件标签体内容 */}
                {this.props.children}
            </div>
        )
    }
}

class B extends Component {
    render() {
        console.log("B---render");
        return (
            <div style={{ backgroundColor: "red", padding: "30px" }}>
                <h3>B组件</h3>
            </div>
        )
    }
}
render props
<A render={(data) => <C data={data}></C>}></A>
A组件: {this.props.render(内部state数据)}
C组件: 读取A组件传入的数据显示 {this.props.data} 

render props例子:

import React, { Component } from 'react'
import "./index.css"
export default class Parent extends Component {
    render() {
        return (
            <div className='parent'>
                <h1>parent页面</h1>


                {/* render props例子: */}
                {/* 组件A给子组件B通过props传递参数name */}
                <A render={(name) => <B name={name} />} />
            </div>
        )
    }
}

class A extends Component {
    render() {
        console.log(this.props); //{render:}
        return (
            <div className='child'>
                <h1>我是A组件</h1>
                {/* 拿到父组件中的A组件标签体内容 */}
                {/* 通过render props拿到子组件并渲染出来,且可以在子组件中传递参数给父组件 */}
                {this.props.render("wh")}
            </div>
        )
    }
}

class B extends Component {
    render() {
        console.log("B---render");
        return (
            <div style={{ backgroundColor: "red", padding: "30px" }}>
                <h3>B组件</h3>
            </div>
        )
    }
}

总结而言:传递的props对象中根据传递的组件情况会包含children属性或者render属性,children就是一个组件,而render是一个渲染组件的方法。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

veggie_a_h

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

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

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

打赏作者

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

抵扣说明:

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

余额充值