对React children 的深入理解
React的核心为组件。你可以像嵌套HTML标签一样嵌套使用这些组件,这使得编写JSX更加容易因为它类似于标记语言。 当我刚开始学习React时,当时我认为“使用 因为我们使用的事JavaScript,我们会改变children。我们能够给它们发送特殊的属性,以此来决定它们是否进行渲染。让我们来探究一下React中children的作用。 子组件我们有一个组件 <Grid> <Row /> <Row /> <Row /> </Grid> 这三个 class Grid extends React.Component { render() { return <div>{this.props.children}</div> } } 父组件也能够决定不渲染任何的子组件或者在渲染之前对它们进行操作。例如,这个 class Fullstop extends React.Component { render() { return <h1>Hello world!</h1> } } 不管你将什么子组件传递给这个组件,它都只会显示“Hello world!” 任何东西都能是一个childReact中的Children不一定是组件,它们可以使任何东西。例如,我们能够将上面的文字作为children传递我们的 <Grid>Hello world!</Grid> JSX将会自动删除每行开头和结尾的空格,以及空行。它还会把字符串中间的空白行压缩为一个空格。 这意味着以下的这些例子都会渲染出一样的情况: <Grid>Hello world!</Grid> <Grid> Hello world! </Grid> <Grid> Hello world! </Grid> <Grid> Hello world! </Grid> 你也可以将多种类型的children完美的结合在一起: <Grid> Here is a row: <Row /> Here is another row: <Row /> </Grid> child 的功能我们能够传递任何的JavaScript表达式作为children,包括函数。 为了说明这种情况,以下是一个组件,它将执行一个传递过来的作为child的函数: class Executioner extends React.Component { render() { // See how we're calling the child as a function? // ↓ return this.props.children() } } 你会像这样的使用这个组件 <Executioner> {() => <h1>Hello World!</h1>} </Executioner> 当然,这个例子并没什么用,只是展示了这个想法。 假设你想从服务器获取一些数据。你能使用多种方法实现,像这种将函数作为child的方法也是可行的。 <Fetch url="api.myself.com"> {(result) => <p>{result}</p>} </Fetch> 不要担心这些超出了你的脑容量。我想要的是当你以后遇到这种情况时不再惊讶。有了children什么事都会发生。 操作children如果你看过React的文档你就会说“children是一个不透明的数据结构”。从本质上来讲, React提供了一系列的函数助手来使得操作children更加方便。 循环两个最显眼的函数助手就是 class IgnoreFirstChild extends React.Component { render() { const children = this.props.children return ( <div> {React.Children.map(children,(child,i) => { // Ignore the first child if (i < 1) return return child })} </div> ) } }
<IgnoreFirstChild> <h1>First</h1> <h1>Second</h1> // <- Only this is rendered </IgnoreFirstChild> 在这种情况下,我们也可以使用
然而使用 <IgnoreFirstChild> {() => <h1>First</h1>} // <- Ignored |
- c – std :: string :: erase如何从字符串中删除字符?
- reactjs – 无法设置#的属性createElement,它只是一个gette
- 申请TexturePacker免费注册码(TP:68D951F8)
- 我眼中的flash cache
- 火云开发课堂 - 《Shader从入门到精通》系列 第十四节:在Sh
- Cocos2d-x android 编译错误 undefined reference to '
- 【Quick-COCOS2D-X 3.3 如何绑定自定义类至Lua之二】新建项
- 将SELECT DISTINCT转换为Postgresql到MySQL的查询
- 正则表达式30分钟入门教程
- SQLite入门与分析(三)---内核概述(1)