我以我对ReactJs还是很陌生的事实作为开始,并可能试图制定一些非常基础的东西。
我有一段带有自定义HTML的代码:
示例组件
gem install rdoc
侧面问题-上面的正确名称是什么?碎片?它看起来并不是一个“组件”,而只是也学习了React的命名约定
使用组件
const Sample = ({ title, children }) => {
return (
<div class="panel">
<div class="title">
{title}
</div>
<div class="body">
{children}
</div>
</div>
);
};
使用示例组件的所需方式
export default class ExampleComponent extends Component {
render() {
return <div class="page-body">
<div class="row">
<h1> Page 1 </h1>
<Sample title={<h1>Some title!</h1>}>
<p>This is my sample body!</p>
</Sample>
</div>
</div>
}
}
我在其他人创建的组件之前使用过这种类型的方法,但是现在我想自己做,发现很难找到一个简单的示例来做这个事情。
在此先感谢任何指针!
答案 0 :(得分:3)
我想您想要的是JSX Namespacing吗?无论哪种方式,您都可以实例化Sample,然后将更多组件添加为Sample的属性(将其视为对象):
import React from "react"
const Sample = ({ children }) => (
<div className="panel">
{children}
</div>
)
Sample.Title = (props) => <div className="title">{props.children}</div>
Sample.Body = (props) => <div className="body">{props.children}</div>
export default Sample
注意:由于我们使用的是JSX,因此React使用className
而不是class
。
答案 1 :(得分:2)
在这种情况下,您只需要将相关的容器提取到它们自己的组件中即可
const Sample = ({children }) => (
<div className="panel">{children}</div>
);
const Title = ({children}) => (
<div className="title">{children}</div>
);
const Body = ({children}) => (
<div className="body">{children}</div>
);
Sample.Title = Title;
Sample.Body = Body;
还要注意,css类的正确属性是className
。
答案 2 :(得分:2)
Children
实用套装对您的情况很有帮助。
import { Children } from 'react'
const Sample = ({ title, children }) => {
let _body, _title
Children.forEach(children, child => {
if (child.type === SampleTitle) {
return _title = child
}
if (child.type === SampleBody) {
return _body = child
}
})
if (!_title) _title = <div className='title'>{title}</div>
if (!_body) _body = <div className='title'>{children}</div>
return (
<div className='panel'>
{_title}
{_body}
</div>
)
}
const SampleTitle = ({ children }) => <div className='title'>{children}</div>
const SampleBody = ({ children }) => <div className='body'>{children}</div>
Sampe.Title = SampleTitle
Sample.Body = SampleBody
现在您可以通过多种方式使用示例:
<Sample title="my title">
<div>my body</div>
</Sample>
<Sample title="my title">
<Sample.Body>my body</Sample.Body>
</Sample>
<Sample title="my fallback title">
<Sample.Title>my overriding title</Sample.Title>
<Sample.Body>my body</Sample.Body>
</Sample>