React js教程(14):在 ReactJS 中渲染属性(Render Props)和上下文(Content)
本文是React 教程系列的一部分。您可以在此处找到本系列之前所有帖子的链接
介绍
在上一篇文章中,我们了解了 React 中的高阶组件及其用法。在本文中,我们将介绍 Render Props 和 React 中 Context 的概念。
Render Props
React 中的 Render Props 是为组件的 props 分配一个函数并在组件的 render 方法中调用的东西。调用该函数将返回一个 React 元素或组件。React Router 和 Downshift 等第三方库使用这种方法。
render prop是组件用来知道要渲染什么的函数属性。通过这个,我们还可以将一个状态传递给另一个状态。
让我们看一个演示。
创建一个 Movement.js 文件和代码如下,
import React, { Component } from 'react'
export class Movement extends Component {
constructor(props) {
super(props)
this.state = {
x:0,
y:0
}
}
onMouseMove =(event) => {
this.setState({
x:event.clientX,
y:event.clientY
})
}
render() {
const{x,y} = this.state
return (
<div style={{height : '100%'}} onMouseMove={this.onMouseMove}>
<h1> The current mouse position is ({x},{y})</h1>
</div>
)
}
}
export default Movement
现在在 App.js 中添加这个 Movement.js,
现在让我们继续演示,我们将创建一个名为 Monkey 的组件,在其中移动鼠标时,猴子也会跟随香蕉移动。
让我们看看演示。修改Movement.js的代码如下。
import React, { Component } from 'react'
import PropTypes from 'prop-types'
export class Movement extends Component {
static propTypes = {
render: PropTypes.func.isRequired
}
state={x:0,y:0}
onMouseMove =(event) => {
this.setState({
x:event.clientX,
y:event.clientY
})
}
render() {
return (
<div onMouseMove={this.onMouseMove}>
{this.props.render(this.state)}
</div>
)
}
}
export default Movement
import React, { Component } from 'react'
import monkey from '../images/monkey.jpg'
import banana from '../images/banana.jpg'
export class Monkey extends Component {
render() {
const{x,y} = this.props.Movement
return (
<div>
<img src={monkey} alt='monkey' style={{position:'relative',left:x,right:y,height:150}}></img>
<img src={banana} alt='banana' style={{position:'relative',left:(x+10),right:(y+10),height:30}}></img>
</div>
)
}
}
export default Monkey
import React from 'react';
import './App.css';
import './css/custom.css';
import Movement from './components/Movement'
import Monkey from './components/Monkey'
function App() {
return (
<div>
<Movement render={({x,y}) => (
<Monkey Movement={{x,y}}/>
)}/>
</div>
);
}
export default App;
这将显示如下输出。

在上图中,移动鼠标时,猴子也会移动。上面的演示非常有趣,让我们允许使用 react-motion API 创建其他动画。
现在,我们将看到 ReactJS 中 Context 的概念。
Context
React.js 中的上下文是通过组件树传递数据的概念,而无需手动将 props 向下传递到每个级别。
在基本的 React 应用程序中,将数据从父级传递到子级是使用 props 完成的,但是如果数据需要在多个级别上传递,例如传递应用程序中大多数组件所需的用户名或主题,这是一种繁重的方法。Context 允许您提供在组件之间共享值的功能,而无需通过组件树的每一层显式传递 props。
当不需要传递道具时需要将当前身份验证、主题或首选语言传递给子级别时,主要使用上下文。
要使用上下文获取数据,我们需要遵循 3 个步骤,
- 我们需要首先创建上下文。
- 然后我们需要为上下文提供价值。
- 最后,我们需要消耗上下文的值。
现在让我们看一下演示,
例如 – 在当前演示中,我们将看到如何使用上下文在子组件中使用用户名。
首先,我们将创建一个新文件 UserContext.js。这是我们创建上下文的第一步
import React from 'react'
const UserContext = React.createContext()
const UserProvider = UserContext.Provider
const UserConsumer = UserContext.Consumer
export {UserProvider,UserConsumer}
现在,我们将创建一个嵌套结构,我将在其中创建 3 级组件主组件 -> 主页组件 -> 配置文件组件。
我们将在 App.js 中执行我们需要为消费者提供价值的第二步,
import React from 'react';
import './App.css';
import './css/custom.css';
import MasterComponent from './components/MasterComponent'
import { UserProvider } from './components/UserContext';
function App() {
return (
<div className="App">
<UserProvider value="New User">
<MasterComponent />
</UserProvider>
</div>
);
}
export default App;
import React, { Component } from 'react'
import HomeComponent from './HomeComponent'
class MasterComponent extends Component {
render() {
return (
<div>
<HomeComponent/>
</div>
)
}
}
export default MasterComponent
import React, { Component } from 'react'
import ProfileComponent from './ProfileComponent'
class HomeComponent extends Component {
render() {
return (
<div>
<ProfileComponent/>
</div>
)
}
}
export default HomeComponent
import React, { Component } from 'react'
import { UserConsumer } from './UserContext';
class ProfileComponent extends Component {
render() {
return (
<UserConsumer>
{
(username) => {
return <div>Hello {username}</div>
}
}
</UserConsumer>
)
}
}
export default ProfileComponent
现在输出将显示如下,
如果在 UserContext.js 中创建上下文时我们将定义默认值,如果我们不在组件中提供任何值,那么它将从 UserContext 中获取默认值,
常见问题FAQ
- 程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
- 请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!