React Render Props 模式

简介:

概述

Render Props模式是一种非常灵活复用性非常高的模式,它可以把特定行为或功能封装成一个组件,提供给其他组件使用让其他组件拥有这样的能力,接下来我们一步一步来看React组件中如何实现这样的功能。

React 组件数据传递

React中我们可以给一个组件传递一些props并且在组件内部展示,同样的我们也可以传递一些组件同样也是行得通的,一起看一个例子

1. 组件普通数据传递

我们可以通过组件传递一些字符串数据,并且在组件内部渲染 下面的代码很平常,我们绝大多数代码都是这样。

const Foo = ({ title }) => (
 <div> <p>{title}</p> </div>
);
class App extends React.Component {
 render() {
 return (
 <div> <h2>这是一个示例组件</h2> <Foo title="大家好,我是土豆" /> </div>
 );
 }
}
ReactDOM.render(<App />, document.getElementById('app'))

2. 组件上传递组件

更进一步,我们可以在组件上传递普通的HTML 标签React 组件达到复用的目的

// https://codepen.io/tudou/full/OvdrPW const Bar = () => (<p>我是Bar组件 :)</p>);
const Foo = ({ title, component }) => (
 <div> <p>{title}</p>
 {component()}
 </div>
);
class App extends React.Component {
 render() {
 return (
 <div> <h2>这是一个示例组件</h2> <Foo title={<p>大家好,我是土豆</p>} component={() => <Bar /> } />
 </div>
 );
 }
}
ReactDOM.render(<App />, document.getElementById('app'))

在上面的例子中传递普通的HTML 标签对我们复用组件没有任何帮助,重点可以看传递component这个参数,它传递给Foo组件一个函数这个函数返回的是一个Bar 组件,我们会在Foo 组件中调用并且显示component函数中的组件。我们再来写一个小的DEMO进行验证。

3. 一个纯粹的Render Props例子

// https://codepen.io/tudou/full/dmawvY const Bar = ({ title }) => (<p>{title}</p>);

class Foo extends React.Component {
 constructor(props) {
 super(props);
 this.state = { title: '我是一个state的属性' };
 }
 render() {
 const { render } = this.props;
 const { title } = this.state;
 
 return (
 <div>
 {render(title)}
 </div>
 )
 }
}

class App extends React.Component {
 render() {
 return (
 <div>
 <h2>这是一个示例组件</h2>
 <Foo render={(title) => <Bar title={title} />} />
 </div>
 );
 }
}
ReactDOM.render(<App />, document.getElementById('app'))

在上面的例子中,给Foo 组件传递了一个render参数它是一个函数这个函数返回一个Bar组件,这个函数接受一个参数title他来自于Foo 组件调用时传递并且我们又将title 属性传递给了Bar 组件。经过上述的调用过程我们的Bar 组件就可以共享到Foo 组件内部的state 属性`。

4. 通过children传递

这个demo略微不同于上面通过props传递,而它是通过组件的children传递一个函数给Foo 组件

// https://codepen.io/tudou/full/WzPPeL const Bar = ({ title }) => (<p>{title}</p>);

class Foo extends React.Component {
 constructor(props) {
 super(props);
 this.state = { title: '我是一个state的属性' };
 }
 render() {
 const { children } = this.props;
 const { title } = this.state;
 
 return (
 <div>
 {children(title)}
 </div>
 )
 }
}

class App extends React.Component {
 render() {
 return (
 <div> <h2>这是一个示例组件</h2> <Foo>
 {(title) => (
 <Bar title={title} />
 )}
 </Foo> </div>
 );
 }
}
ReactDOM.render(<App />, document.getElementById('app'))

观察可发现只是写法略微有些变法,我们将要传递的数据放到的组件的children。实际上并无不同之处(都是传递一个函数)

<Foo>
 {(title) => (
 <Bar title={title} />
 )}
</Foo> 

注意事项

请注意当我们的Foo 组件继承于React.PureComponent的时候,我们需要避免下面这样的写法。不然我们的性能优化将付之东流。

render() {
 return (
 <div> <h2>这是一个示例组件</h2> <Foo render={(title) => <Bar title={title} />} />
 </div>
 );
 }

如果你在render创建一个函数,在每次渲染的时候render prop将会是一个新的值,那么每次将会重新渲染Bar

正确的做法应该是在组件内部创建一个函数用于显示组件

const Bar = ({ title }) => (<p>{title}</p>);

class Foo extends React.Component {
 constructor(props) {
 super(props);
 this.state = { title: '我是一个state的属性' };
 }
 render() {
 const { render } = this.props;
 const { title } = this.state;
 
 return (
 <div>
 {render(title)}
 </div>
 )
 }
}

class App extends React.Component {
 // 单独创建一个渲染函数
 renderFoo(title) {
 return <Bar title={title} />;
 }
 render() {
 return (
 <div>
 <h2>这是一个示例组件</h2>
 <Foo render={this.renderFoo} />
 </div>
 );
 }
}
ReactDOM.render(<App />, document.getElementById('app'))

总结

学习了解Render Props渲染模式原理,使用了renderchildren两种不同的渲染方法。

原文发布时间:04/10

原文作者:开源中国最帅没有之一

本文来源开源中国如需转载请紧急联系作者


相关文章
|
4月前
|
前端开发 JavaScript
react学习(13)props
react学习(13)props
|
5月前
|
前端开发
React函数式组件props的使用(六)
【8月更文挑战第14天】React函数式组件props的使用(六)
78 1
React函数式组件props的使用(六)
|
4月前
|
前端开发
学习react基础(2)_props、state和style的使用
本文介绍了React中组件间数据传递的方式,包括props和state的使用,以及如何在React组件中使用style样式。
44 0
|
5月前
|
移动开发 资源调度 前端开发
介绍React路由模式
【8月更文挑战第10天】介绍React路由模式
66 12
|
5月前
|
JavaScript 前端开发 API
[译] 用 Vue 3 Composition API 实现 React Context/Provider 模式
[译] 用 Vue 3 Composition API 实现 React Context/Provider 模式
|
4月前
|
前端开发
React添加路径别名alias、接受props默认值、并二次封装antd中Modal组件与使用
本文介绍了在React项目中如何添加路径别名alias以简化模块引入路径,设置组件props的默认值,以及如何二次封装Ant Design的Modal组件。文章还提供了具体的代码示例,包括配置Webpack的alias、设置defaultProps以及封装Modal组件的步骤和方法。
104 1
React添加路径别名alias、接受props默认值、并二次封装antd中Modal组件与使用
|
3月前
|
前端开发 JavaScript CDN
React Props
10月更文挑战第8天
24 0
|
4月前
|
前端开发
react学习(15)函数式组件中使用props
react学习(15)函数式组件中使用props
|
4月前
|
前端开发
react学习(14)类式组件的构造器与props
react学习(14)类式组件的构造器与props
|
4月前
|
前端开发 JavaScript
React 中的 props 属性传递技巧
【9月更文挑战第6天】本文详细介绍了React中`props`的基本用法,包括传递基本数据类型、对象和数组。文章通过多个代码示例展示了如何正确使用`props`,并探讨了常见的问题及解决方法,如`props`不可变性、默认值设置及类型检查等。正确掌握这些技巧有助于提升编程效率,编写出更健壮的代码。
107 13