在这个问题上我的意思是。想象一下,我想显示一个名为“表单”的组件,并且在“表单”内部有一个名为“ checkboxex”的组件列表
正常的操作方法如下:
padding-bottom: 100%
然后在Form内部,我将其映射(Array.map)
我想知道有没有办法做到这一点:
const checkboxes = [1, 2, 3];
<Form checkBoxes={checkboxex} />
有人可以向我解释一下是否可能,有什么区别?非常感谢!
答案 0 :(得分:1)
在类似组件内传递的所有内容都会自动转换为children
道具。您可以像这样在Form
内部访问它们:
//...
render() {
<div>
{this.props.children}
</div>
}
//...
答案 1 :(得分:1)
您提到的模式是2018/09/13 21:29:38[error]11#11: Failed to download rollouts: UNAVAILABLE: Failed to connect to the service management, Response body:
2018/09/13 21:30:08 [error] 11#11: servicemanagement.googleapis.com could not be resolved (110: Operation timed out)
2018/09/13 21:30:08 [error] 11#11: servicemanagement.googleapis.com could not be resolved (110: Operation timed out)
2018/09/13 21:30:08 [error] 11#11: servicemanagement.googleapis.com could not be resolved (110: Operation timed out)
2018/09/13 21:30:38 [error] 11#11: servicemanagement.googleapis.com could not be resolved (110: Operation timed out)
2018/09/13 21:30:38 [error] 11#11: servicemanagement.googleapis.com could not be resolved (110: Operation timed out)
2018/09/13 21:30:38 [error] 11#11: servicemanagement.googleapis.com could not be resolved (110: Operation timed out)
道具模式,其中嵌套的children
作为子代传递给组件。
当您将JSX
作为JS
的一部分时,必须将它们包装在JSX
{}
您的<Form>
{ checkboxes.map(id => <Checkbox key={id} id={id} />) }
</Form>
组件Form
方法看起来像这样。
render
如果您传递的子代是一个函数,则只需在render() {
<div>
{this.props.children}
</div>
}
组件中调用它即可。
Form
您只是调用子级,因为它是作为函数传递的。
<Form>
{() => {
return checkboxes.map(id => <Checkbox key={id} id={id} />)
}}
</Form>
答案 2 :(得分:0)
通常,两种方法都是相同的。他们以某种方式在父组件(Form
)中呈现了一些JSX。
在第一个中,您要将数据传递给父级,然后以某种方式希望在其子级中使用此数据。
在第二个中,您打算映射数据,然后将带有此数据的子组件传递给父组件。因此,实际上,您正在向父母传递一个道具:children
。您的问题并不能反映您的需求。但是,您要问的是区别。差异可能是您在Form
中及其子元素中使用方式和用途的逻辑。
考虑这种情况。您在handleClick
组件中有一个Form
方法,并且想要将此方法传递给子组件,每个Checkbox
。这是两个版本。
没有儿童道具
const checkboxes = [1, 2, 3];
class App extends React.Component {
render() {
return (
<div>
<Form checkboxes={checkboxes} />
</div>
);
}
}
const Form = props => {
const handleClick = id => console.log("id is", id);
return (
<div>
{props.checkboxes.map(id => (
<Checkbox id={id} key={id} handleClick={handleClick} />
))}
</div>
);
};
const Checkbox = props => {
const handleClick = () => props.handleClick(props.id);
return (
<div onClick={handleClick} style={{ padding: "10px" }}>
This is Checkbox and id is <strong>{props.id}</strong>
.Click me and look the console.
</div>
);
};
ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>
有儿童道具
const checkboxes = [1, 2, 3];
class App extends React.Component {
render() {
return (
<div>
<Form>
{checkboxes.map(id => (
<Checkbox id={id} key={id} />
))}
</Form>
</div>
);
}
}
const Form = props => {
const handleClick = id => console.log("id is", id);
return (
<div>
{React.Children.map(props.children, child =>
React.cloneElement(child, {
handleClick
})
)}
</div>
);
};
const Checkbox = props => {
const handleClick = () => props.handleClick(props.id);
return (
<div style={{ padding: "10px" }} onClick={handleClick}>
This is Checkbox and id is <strong>{props.id}</strong>
.Click me and look the console.
</div>
);
};
ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>
您可以在这里看到斗争:)因此,您可以根据自己的需要选择其中之一。如果您没有像第二个示例那样设置逻辑,则可以使用children
道具。实际上,您可以使用此逻辑创建可重用的组件。我只是想在这里展示一个优势案例。