如何将额外的 属性 传递给 reactjs 中的子元素?
How to pass extra property to a children element in a reactjs?
这是我的目标。我想创建一个复合组件,它将在显示 children
元素之前检查匹配的 url 的有效性。否则它 return 显示错误消息的通用组件。
所以这是我的代码 'decorator':
const EnforceUrlValidation = (test, children) => {
const fn = ({ match }) => {
if (! test( match )) {
return ( <InvalidUrlContainer /> );
}
return ({children});
}
return fn;
}
在我的路由器中是这样使用的:
const WelcomePage = EnforceUrlValidation(
(match) => {
const articleId = match.params.articleId;
return articleId && isValidarticleId(articleId);
}
, <WelcomeContainer/>
)
...
<Routers>
<Switch>
<Route
path="/:articleId"
component={WelcomePage}
/>
...
</Routers>
我现在的问题是,我仍然想将match
对象传递到EnforceUrlValidation
里面的children
。我怎样才能做到这一点?
尝试 1:
const EnforceUrlValidation = (test, children) => {
const fn = ({ match }) => {
if (! test( match )) {
return ( <InvalidUrlContainer /> );
}
return (<children match={match} />);
}
return fn;
}
在这种情况下 children
不会呈现。
尝试 2:
const EnforceUrlValidation = (test, children) => {
const fn = ({ match }) => {
if (! test( match )) {
return ( <InvalidUrlContainer /> );
}
return (
<div match={match} >{children} </div>
)
}
return fn;
}
失败因为div
不支持match
您可以使用 React.cloneElement
将 属性 添加到 children:
const EnforceUrlValidation = (test, children) => {
const fn = ({ match }) => {
if (! test( match )) {
return ( <InvalidUrlContainer /> );
}
const extendedChild = React.cloneElement(children, {match: match});
return extendedChild;
}
return fn;
}
这是我的目标。我想创建一个复合组件,它将在显示 children
元素之前检查匹配的 url 的有效性。否则它 return 显示错误消息的通用组件。
所以这是我的代码 'decorator':
const EnforceUrlValidation = (test, children) => {
const fn = ({ match }) => {
if (! test( match )) {
return ( <InvalidUrlContainer /> );
}
return ({children});
}
return fn;
}
在我的路由器中是这样使用的:
const WelcomePage = EnforceUrlValidation(
(match) => {
const articleId = match.params.articleId;
return articleId && isValidarticleId(articleId);
}
, <WelcomeContainer/>
)
...
<Routers>
<Switch>
<Route
path="/:articleId"
component={WelcomePage}
/>
...
</Routers>
我现在的问题是,我仍然想将match
对象传递到EnforceUrlValidation
里面的children
。我怎样才能做到这一点?
尝试 1:
const EnforceUrlValidation = (test, children) => {
const fn = ({ match }) => {
if (! test( match )) {
return ( <InvalidUrlContainer /> );
}
return (<children match={match} />);
}
return fn;
}
在这种情况下 children
不会呈现。
尝试 2:
const EnforceUrlValidation = (test, children) => {
const fn = ({ match }) => {
if (! test( match )) {
return ( <InvalidUrlContainer /> );
}
return (
<div match={match} >{children} </div>
)
}
return fn;
}
失败因为div
不支持match
您可以使用 React.cloneElement
将 属性 添加到 children:
const EnforceUrlValidation = (test, children) => {
const fn = ({ match }) => {
if (! test( match )) {
return ( <InvalidUrlContainer /> );
}
const extendedChild = React.cloneElement(children, {match: match});
return extendedChild;
}
return fn;
}