在本文中,我们将详细介绍如何将道具传递给{this.props.children}的各个方面,并为您提供关于道具导入的相关解答,同时,我们也将为您带来关于#react#this.props.child
在本文中,我们将详细介绍如何将道具传递给{this.props.children}的各个方面,并为您提供关于道具导入的相关解答,同时,我们也将为您带来关于#react# this.props.children的处理、javascript – React:为什么`this.props.children`未定义?、javascript – React:使用this.props.children或将组件作为命名道具传递、JavaScript如何将道具传递给{this.props.children}的有用知识。
本文目录一览:- 如何将道具传递给{this.props.children}(道具导入)
- #react# this.props.children的处理
- javascript – React:为什么`this.props.children`未定义?
- javascript – React:使用this.props.children或将组件作为命名道具传递
- JavaScript如何将道具传递给{this.props.children}
如何将道具传递给{this.props.children}(道具导入)
我试图找到定义可以以一般方式使用的组件的正确方法:
<Parent> <Child value="1"> <Child value="2"></Parent>
当然,可以想象<select>
并在父组件和子组件之间进行渲染的<option>
逻辑。
对于这个问题,这是一个虚拟的实现:
var Parent = React.createClass({ doSomething: function(value) { }, render: function() { return (<div>{this.props.children}</div>); }});var Child = React.createClass({ onClick: function() { this.props.doSomething(this.props.value); // doSomething is undefined }, render: function() { return (<div onClick={this.onClick}></div>); }});
问题是,每当您用于{this.props.children}
定义包装器组件时,如何将某些属性传递给其所有子组件?
答案1
小编典典用新道具克隆Children
您可以使用React.Children遍历子级,然后使用React.cloneElement使用新的道具(浅合并)克隆每个元素,例如:
import React, { Children, isValidElement, cloneElement } from ''react'';const Child = ({ doSomething, value }) => ( <div onClick={() => doSomething(value)}>Click Me</div>);function Parent({ children }) { function doSomething(value) { console.log(''doSomething called by child with value:'', value); } render() { const childrenWithProps = Children.map(children, child => { // Checking isValidElement is the safe way and avoids a TS error too. if (isValidElement(child)) { return cloneElement(child, { doSomething }) } return child; }); return <div>{childrenWithProps}</div> }};ReactDOM.render( <Parent> <Child value="1" /> <Child value="2" /> </Parent>, document.getElementById(''container''));
小提琴:https :
//jsfiddle.net/2q294y43/2/
称呼children为功能
您也可以将道具传递给带有渲染道具的children。在这种方法中,子代(可以是children
或任何其他prop名称)是一个函数,可以接受您要传递的任何参数并返回子代:
const Child = ({ doSomething, value }) => ( <div onClick={() => doSomething(value)}>Click Me</div>);function Parent({ children }) { function doSomething(value) { console.log(''doSomething called by child with value:'', value); } render() { // Note that children is called as a function and we can pass args to it return <div>{children(doSomething)}</div> }};ReactDOM.render( <Parent> {doSomething => ( <React.Fragment> <Child doSomething={doSomething} value="1" /> <Child doSomething={doSomething} value="2" /> </React.Fragment> )} </Parent>, document.getElementById(''container''));
如果您愿意,也可以代替<React.Fragment>
或简单地<>
返回一个数组。
小提琴:https :
//jsfiddle.net/ferahl/y5pcua68/7/
#react# this.props.children的处理
React.Children 是顶层API之一,为处理 this.props.children 这个封闭的数据结构提供了有用的工具。
this.props 对象的属性与组件的属性一一对应,但是有一个例外,就是 this.props.children 属性。它表示组件的所有子节点。
this.props.children 的值有三种可能:如果当前组件没有子节点,它就是 undefined ;如果有一个子节点,数据类型是 object ;如果有多个子节点,数据类型就是 array 。所以,处理 this.props.children 的时候要小心。
this.props.children的返回值情况如下:
<NotesList>
<span>hello</span>
<span>hello</span>
</NotesList>
//返回两个子节点
<NotesList></NotesList>
//返回undefined
<NotesList>null</NotesList>
//返回null
React 提供一个工具方法 React.Children 来处理 this.props.children 。我们可以用 React.Children.map 来遍历子节点,而不用担心 this.props.children 的数据类型是 undefined 还是 object。
React.Children.map
object React.Children.map(object children, function fn [object context])
在每一个直接子级(包含在 children 参数中的)上调用 fn 函数,此函数中的 this 指向 上下文。如果 children 是一个内嵌的对象或者数组,它将被遍历:不会传入容器对象到 fn 中。如果 children 参数是 null 或者 undefined,那么返回 null 或者 undefined 而不是一个空对象。
使用方法:
React.Children.map(this.props.children, function (child) {
return <li>{child}</li>;
})
React.Children.forEach
React.Children.forEach(object children, function fn [object context])
类似于 React.Children.map(),但是不返回对象。
使用方法
this.props.children.forEach(function (child) {
return <li>{child}</li>
})
类似于 React.Children.map(),但是不返回对象
React.Children.count
number React.Children.count(object children)
返回 children 当中的组件总数,和传递给 map 或者 forEach 的回调函数的调用次数一致。
<NotesList>
<span>hello</span>
<span>hello</span>
</NotesList>
console.log(React.Children.count(this.props.children)); //2
<NotesList></NotesList>
console.log(React.Children.count(this.props.children)); //0
<NotesList>null</NotesList>
console.log(React.Children.count(this.props.children)); //1
React.Children.only
object React.Children.only(object children)
返回 children 中 仅有的子级。否则抛出异常。
这里仅有的子级,only方法接受的参数只能是一个对象,不能是多个对象(数组)
console.log(React.Children.only(this.props.children[0]));
//输出对象this.props.children[0]
函数调用
<input type="button" value=''登 录'' className=''login-button'' onClick={this.loginAjax.bind(this,''01'')}/>
function loginAjax(param, event){}
javascript – React:为什么`this.props.children`未定义?
var ResistanceCalculator = React.createClass({ getinitialState: function() { return {bands: [0,0]} },componentDidMount: function() { console.log(this.props.children); // => undefined },render: function() { return ( <div> <OhmageIndicator bands={this.state.bands} /> <SVGResistor bands={this.state.bands} /> <BandSelector band={1} /> <BandSelector band={2} /> <BandSelector band={3} /> <BandSelector band={4} /> <BandSelector band={5} /> </div> ); } });
BandSelector渲染< select>元素和当一个更改我想更新ResistanceCalculator的状态.所以我的想法是我需要将一个事件监听器绑定到ResistanceCalculator子节点.然而this.props.children似乎是空的.为什么是这样?
解决方法
所以你以错误的方式使用this.props.children.如果我有这样的事情:
<Todos><div /><div /></Todos>
那么,对于Todos组件,this.props.children将是div的数组.
你想要的是简单的回调(working example):
/** @jsx React.DOM */ var ResistanceCalculator = React.createClass({ getinitialState: function() { return {bands: [0,0]}; },handleBandSelectionChange: function(bandindex,newValue) { // for the sake of immutability,clone the array here var bands = this.state.bands.slice(0); bands[bandindex] = newValue; console.log(bandindex,newValue); // yep,seems to work this.setState({bands: bands}); },render: function() { return ( <div> <OhmageIndicator bands={this.state.bands} /> { this.state.bands.map(function(value,i) { return ( <BandSelector band={i} onChange={this.handleBandSelectionChange}/> ); },this) } </div> ); } }); var BandSelector = React.createClass({ handleChange: function(e) { if (this.props.onChange) this.props.onChange(this.props.band,e.target.value); },render: function() { return ( <select onChange={this.handleChange}> <option value="1">1</option> <option value="2">2</option> </select> ); } });
我从select中听到常规的onChange事件,然后在处理程序中调用我父的处理程序(handleBandSelectionChange).请注意,对于父级(ResistanceCalculator),事件不必是onChange;它可以是任何名称,只要孩子称之为.将它命名为“更改”会更好.
作为旁注,this.props.children用于包装组件,这些组件希望在自己完成某些工作时透明地呈现其内容.
javascript – React:使用this.props.children或将组件作为命名道具传递
const Map = props => ( <div id="map"> { this.props.children } </div> ); // Usage: const MapWithLegend = () => ( <div id="map-view"> <Map><Legend /></Map> </div> ); // Usage: const MapWithoutLegend = () => ( <div id="map-view"> <Map /> </div> );
但是,这也可以使用命名道具表达:
const Map = ({ legend } => ( <div id="map">{ legend }</div> ); // Usage: const MapWithLegend = () => ( <div id="map-view"> <Map legend={Legend} /> </div> ); // Usage: const MapWithoutLegend = () => ( <div id="map-view"> <Map /> </div> );
我不确定在缩放和可重用性方面哪种方式最好.最终,我们将不仅仅是传说来放置地图,例如:缩放,缩放/导航控件等……
为此使用React.Children是否有意义,还是应该使用命名道具?
我的直觉是使用this.props.children可以解释Map是否需要渲染一个图例或任何其他子控件,但它还会在Map组件中创建一个后门,即:将任意组件作为子元素传递Map组件.
这是一个问题吗?在渲染它们之前检查父组件中的this.props.children是否常见?如果是这样,怎么样?
那么,造型呢?通过命名道具,我可以定位/设计“儿童”,因为它们被命名,我知道它们是什么.使用React.Children,它是一个需要检查的组件数组,以便它们可以定位,在这种情况下,使用this.props.children可以获得什么?
我已经看到使用这两种范例的第三方组件,但我很好奇一个人选择一个而不是另一个的情景.
解决方法
>只需查看渲染函数,JSX语法就可以轻松地向您显示组件的功能.如果您将图例作为道具传递,则您不知道< Map />会做的.
>它使您能够从容器中传递道具到子容器,该容器呈现地图及其子项.这再次使得< Legend />所发生的事情变得更加明显.
检查孩子听起来像你将实现一个大的switch-case语句来处理所有边缘情况.使用儿童不会产生任何边缘情况.
JavaScript如何将道具传递给{this.props.children}
如何解决JavaScript如何将道具传递给{this.props.children}?
您可以使用React.Children遍历子级,然后使用React.cloneElement使用新的道具(浅合并)克隆每个元素,例如:
const Child = ({ doSomething, value }) => (
<div onClick={() => doSomething(value)}>Click Me</div>
);
class Parent extends React.PureComponent {
doSomething = value => {
console.log(''doSomething called by child with value:'', value);
}
render() {
const childrenWithProps = React.Children.map(this.props.children, child =>
React.cloneElement(child, { doSomething: this.doSomething })
);
return <div>{childrenWithProps}</div>
}
};
ReactDOM.render(
<Parent>
<Child value="1" />
<Child value="2" />
</Parent>,
document.getElementById(''container'')
);
您也可以将道具传递给带有渲染道具的孩子。在这种方法中,子代(可以是children
或任何其他prop名称)是一个函数,可以接受您要传递的任何参数并返回子代:
const Child = ({ doSomething, value }) => (
<div onClick={() => doSomething(value)}>Click Me</div>
);
class Parent extends React.PureComponent {
doSomething = value => {
console.log(''doSomething called by child with value:'', value);
}
render() {
// Note that children is called as a function and we can pass args to it
return <div>{this.props.children(this.doSomething)}</div>
}
};
ReactDOM.render(
<Parent>
{doSomething => (
<React.Fragment>
<Child doSomething={doSomething} value="1" />
<Child doSomething={doSomething} value="2" />
</React.Fragment>
)}
</Parent>,
document.getElementById(''container'')
);
如果您愿意,也可以代替<React.Fragment>
或简单地<>
返回一个数组。
解决方法
我正在尝试找到定义可以以一般方式使用的某些组件的正确方法:
<Parent>
<Child value="1">
<Child value="2">
</Parent>
当然,您可以想象<select>
并<option>
作为该逻辑的示例,在父组件和子组件之间存在一种渲染逻辑。
对于这个问题,这是一个虚拟的实现:
var Parent = React.createClass({
doSomething: function(value) {
},render: function() {
return (<div>{this.props.children}</div>);
}
});
var Child = React.createClass({
onClick: function() {
this.props.doSomething(this.props.value); // doSomething is undefined
},render: function() {
return (<div onClick={this.onClick}></div>);
}
});
问题是,每当您用于{this.props.children}
定义包装器组件时,如何将某些属性传递给其所有子组件?
我们今天的关于如何将道具传递给{this.props.children}和道具导入的分享就到这里,谢谢您的阅读,如果想了解更多关于#react# this.props.children的处理、javascript – React:为什么`this.props.children`未定义?、javascript – React:使用this.props.children或将组件作为命名道具传递、JavaScript如何将道具传递给{this.props.children}的相关信息,可以在本站进行搜索。
本文标签: