때때로로 렌더링해야 할 구성 요소가 <anchor>
있고 다른 시간에는 <div>
. prop
내가 이것을 결정하는 읽기입니다 this.props.url
.
존재하는 경우 <a href={this.props.url}>
. 그렇지 않으면 그냥 <div/>
.
가능한?
이것이 제가 지금하고있는 일이지만 단순화 할 수 있다고 생각합니다.
if (this.props.link) {
return (
<a href={this.props.link}>
<i>
{this.props.count}
</i>
</a>
);
}
return (
<i className={styles.Icon}>
{this.props.count}
</i>
);
최신 정보:
다음은 최종 잠금입니다. 팁 주셔서 감사합니다, @Sulthan !
import React, { Component, PropTypes } from 'react';
import classNames from 'classnames';
export default class CommentCount extends Component {
static propTypes = {
count: PropTypes.number.isRequired,
link: PropTypes.string,
className: PropTypes.string
}
render() {
const styles = require('./CommentCount.css');
const {link, className, count} = this.props;
const iconClasses = classNames({
[styles.Icon]: true,
[className]: !link && className
});
const Icon = (
<i className={iconClasses}>
{count}
</i>
);
if (link) {
const baseClasses = classNames({
[styles.Base]: true,
[className]: className
});
return (
<a href={link} className={baseClasses}>
{Icon}
</a>
);
}
return Icon;
}
}
답변
변수를 사용하십시오.
var component = (
<i className={styles.Icon}>
{this.props.count}
</i>
);
if (this.props.link) {
return (
<a href={this.props.link} className={baseClasses}>
{component}
</a>
);
}
return component;
또는 도우미 함수를 사용하여 콘텐츠를 렌더링 할 수 있습니다. JSX는 다른 것과 같은 코드입니다. 중복을 줄이려면 함수와 변수를 사용하십시오.
답변
요소를 래핑하기위한 HOC (상위 구성 요소)를 만듭니다.
const WithLink = ({ link, className, children }) => (link ?
<a href={link} className={className}>
{children}
</a>
: children
);
return (
<WithLink link={this.props.link} className={baseClasses}>
<i className={styles.Icon}>
{this.props.count}
</i>
</WithLink>
);
답변
다음은 작업을 수행하는 데 사용 된 유용한 구성 요소의 예입니다 (누가 인증해야할지 확실하지 않음).
const ConditionalWrap = ({ condition, wrap, children }) => (
condition ? wrap(children) : children
);
사용 사례 :
<ConditionalWrap condition={someCondition}
wrap={children => (<a>{children}</a>)} // Can be anything
>
This text is passed as the children arg to the wrap prop
</ConditionalWrap>
답변
참조 변수를 사용할 수있는 또 다른 방법이 있습니다.
let Wrapper = React.Fragment //fallback in case you dont want to wrap your components
if(someCondition) {
Wrapper = ParentComponent
}
return (
<Wrapper parentProps={parentProps}>
<Child></Child>
</Wrapper>
)
답변
다음과 같은 util 함수를 사용할 수도 있습니다.
const wrapIf = (conditions, content, wrapper) => conditions
? React.cloneElement(wrapper, {}, content)
: content;
답변
여기에 설명 된대로 JSX if-else를 사용해야합니다 . 이와 같은 것이 작동합니다.
App = React.creatClass({
render() {
var myComponent;
if(typeof(this.props.url) != 'undefined') {
myComponent = <myLink url=this.props.url>;
}
else {
myComponent = <myDiv>;
}
return (
<div>
{myComponent}
</div>
)
}
});
답변
두 개의 구성 요소를 렌더링하는 기능 구성 요소, 하나는 래핑되고 다른 하나는 그렇지 않습니다.
방법 1 :
// The interesting part:
const WrapIf = ({ condition, With, children, ...rest }) =>
condition
? <With {...rest}>{children}</With>
: children
const Wrapper = ({children, ...rest}) => <h1 {...rest}>{children}</h1>
// demo app: with & without a wrapper
const App = () => [
<WrapIf condition={true} With={Wrapper} style={{color:"red"}}>
foo
</WrapIf>
,
<WrapIf condition={false} With={Wrapper}>
bar
</WrapIf>
]
ReactDOM.render(<App/>, document.body)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
다음과 같이 사용할 수도 있습니다.
<WrapIf condition={true} With={"h1"}>
방법 2 :
// The interesting part:
const Wrapper = ({ condition, children, ...props }) => condition
? <h1 {...props}>{children}</h1>
: <React.Fragment>{children}</React.Fragment>;
// stackoverflow prevents using <></>
// demo app: with & without a wrapper
const App = () => [
<Wrapper condition={true} style={{color:"red"}}>
foo
</Wrapper>
,
<Wrapper condition={false}>
bar
</Wrapper>
]
ReactDOM.render(<App/>, document.body)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>