如何在reactjs中将可选元素作为道具传递给组件
How to pass optional elements to a component as a prop in reactjs
我正试图找出一种正确的"react"方式,将一个可选的道具(Element)传递给一个容器组件,该组件的处理方式与该组件的子组件不同。
举个简单的例子,我有一个Panel组件,它渲染它的子级,它还有一个可选的"title"道具(为了这个例子,它是一个元素而不是字符串),它被特别渲染(放在一个特殊的位置,在保持抽象的同时有特殊的行为。
一种选择是有一个从子级中提取并专门渲染的组件:
<Panel>
<Title> some stuff</Title>
<div> some other stuff</div>
</Panel>
但是,像那样把孩子们拉出来单独处理似乎更好些。
这通常是如何在react中处理的,我是否以正确的方式思考
您不需要做任何特别的事情。只需将标题组件作为道具传递,然后在任何需要渲染的地方使用{this.props.title}
:
class Panel extends React.Component {
render() {
return <div>
{this.props.title}
<div>Some other stuff...</div>
</div>;
}
}
class App extends React.Component {
render() {
var title = <Title>My Title</Title>;
return <Panel title={title}/>;
}
}
如果不传递title
道具的任何值(或者该值为false
、null
或undefined
),则不会在那里渲染任何内容。
这是React中相当常见的模式。
您可以执行类似的操作
render(){
<div>
{this.props.title ? this.props.title : null}
{this.props.children}
</div>
}
基本上,如果你把一个title元素作为道具传递,然后把它创建为一个元素并渲染它。。。
要创建它,你可以做这样的事情。
<Panel title={<Title>Something Here</Title>}
<div> something here</div>
</Panel>
这通常是react处理可选子组件的方式
当您需要来自可选prop
的属性时,您必须首先检查是否已交付prop
。否则,您将得到一个:
TypeError: Cannot read property 'yourPropProperty' of undefined
在条件渲染上下文中(取决于我的可选this.props.ignore
数组),将不起作用:
{!this.props.ignore.includes('div')) && (
<div>
Hey
</div>
)}
相反,你应该这样做:
{(!this.props.ignore || !this.props.ignore.includes('div'))) && (
<div>
Hey
</div>
)}
您可以做的一件事是为组件设置默认道具(通常初始化为no-op)。
例如,如果你想有一个可选的功能道具:
class NewComponent extends React.Component {
...
componentDidMount() {
this.props.functionThatDoesSomething()
}
}
NewComponent.defaultProps = {
functionThatDoesSomething: () => {}
}
这样,父组件可以选择是否传递函数道具,并且您的应用程序不会因错误而崩溃
this.props.functionThatDoesSomething不是函数.
- 从组件状态的数组中删除元素
- 自定义HTML元素属性未显示-Web组件
- 从不是wicket组件的元素调用wicket
- Vue.js获取组件中的一个元素
- 为什么不't React缓存子组件的html元素
- 将Vaadin组件放入Javascript组件生成的元素中
- React - 从 DOM 元素获取组件以进行调试
- 访问Vuejs组件内部的元素
- 没有任何 DOM 元素的 Aura 组件
- 组件之后子元素中的某个方法DidMount in parrent 元素
- 如何获取当前Vue组件的DOM元素
- 如何在Vue.js中获取组件元素的offsetHeight
- 如何根据子组件的状态更改父组件样式元素
- React:未捕获的不变量冲突:ReactDOM.render():无效的组件元素
- 如何防止其他元素在拖动任何devexpress组件时高亮显示
- React,将onClick事件直接添加到组件中,而不是在所述组件中渲染元素
- 检票口 - 使用 AJAX 刷新组件 - 文档元素后的垃圾
- 嵌套的组件元素
- Angular 1.5组件元素上的ng-class
- 访问Ext.js gridpanel和内容组件元素