A stateless component
означает, что у него нет state
, а компонент React
в вашем примере будет считаться functional component
. Что касается самого шаблона, то он может быть реализован и в class component
- это не то, что задает c только для functional components
.
Например, приведенный выше код мог быть написан как нижеприведенный, и он даст тот же точный результат:
class MyComponent extends React.Component {
render() {
const buttonProps = {
className: `button`,
onClick: () => {}
}
const getButtonName = () => `Submit`
const getButton = () => {
return (
<button {...buttonProps}>{getButtonName()}</button>
)
}
return (
<div>{getButton()}</div>
)
}
}
Я не знаю контекста, поэтому трудно понять, почему все происходит именно так - лучше спросить разработчик, ответственный за выбор написания компонентов таким способом, чтобы выяснить причину.
К сожалению, или к счастью, React
неубедителен, и люди могут делать все, что им заблагорассудится, что может привести к «странному» "шаблоны, которые не всегда хороши.
Предоставленный вами фрагмент кода создает ненужные абстракции, которые на первый взгляд не ясны - мне пришлось выяснить, что делает getButton
, а затем go до getButtonName
, чтобы увидеть, что визуализируется внутри * Элемент 1021 *, а затем мне пришлось искать buttonProps
, чтобы выяснить, что было передано props
.
Если вам действительно нужна многократно используемая функция, которая возвращает компонент, то почему бы просто не сделать это Способ «React
»?
function Button({ children, ...rest }) {
const defaultProps = {
className: `button`,
onClick: () => {}
}
const props = { ...defaultProps, ...rest }
return (
<button {...props}>
{children}
</button>
)
}
Который затем, возвращаясь к вашему примеру, можно использовать, как в следующем примере:
// by the way, start with an uppercase when naming React components
const MyComponent = ({ p1, p2, p3 }) => {
return (
<div>
<Button>I am a button #1!</Button>
<Button
onClick={() => console.log(`HelloWorld`)}
>
I am a button #2 with a custom `onClick` handler!
</Button>
</div>
)
}
Этот подход намного лучше и чище, поэтому, как вы и предлагали в комментариях, getButton
должен быть записан как фактический React
компонент.