Skip to content

react的插槽实现方式

在开发中,我们抽取了一个组件,但是为了让这个组件具备更强的通用性,我们不能将组件中的内容限制为固定的div、span等等元素

我们应该让使用者可以决定某一块区域到底存放什么内容

这种需求在vue中有一个固定的做法是通过slot来完成的

react对于这种需要插槽的情况非常灵活,有两种方案实现:

  • 组件的children元素
  • props属性传递react元素

插槽实现方式一:children

  • 在组件的双标签里面放东西

  • 每个组件都可以获取到props.children:它包含组件的开始标签和结束标签之间的内容

  • 里面放了多个,那么是装在children数组中的

  • 如果只放了一个,那么就是这个children元素,不是一个元素数组

jsx
...
render() {
	return (
    	<NavBar>
        	<button>按钮</button>
            <h2>我是标题</h2>
            <i>斜体文字</i>
        </NavBar>
    )
}
...
jsx
...
render() {
	const { children } = this.props
    
    return {
          <div className="left">{children[0]}</div>
          <div className="center">{children[1]}</div>
          <div className="right">{children[2]}</div>
    }
}
...

插槽实现方式二:props

  • 第一种方法有一定弊端,因为无法确定children是一个元素还是一个数组,有一些不可控
  • 一般推荐使用这一种方案
jsx
<Banner
  Left={<button>按钮</button>}
/>