反応への移行私は、醜いブール論理がjsx内でどのようにあるかに驚いています。私は次の3つのコンポーネントを使い始めました。リアクションのブール値の要素:ifとIfElse
どうしたのですか?彼らに何も問題がなければ、なぜ反応に組み込まれていないのでしょうか、誰もが使っている既存の図書館によって提供されていませんか?
コンポーネント:
// Simple "if" logic
export const If = ({v, children}) => (v ? children : <div/>)
// "if", "else" logic
export const IfElse = ({v, children}) => {
if (children.length !== 2) {
return <div style={{color: 'red'}}>{`IfElse should receive 2 children, not ${children.length}`}</div>
} else if (v) {
return children[0]
} else {
return children[1]
}
}
// "if", "elseif", ["elseif"...], "else" logic
export const Switch = ({children}) => {
// All but the last child of a Switch component must be "If" components
for (let c of children.slice(0, children.length - 1)) {
if (c.props.v) {
return c.props.children
}
}
return children[children.length - 1]
}
使用法:
const UsageExample = ({foo}) => (
<div>
<If v={foo}>
foo is truey
</If>
{/* is equivalent to */}
{foo && 'foo is true'}
<IfElse v={foo === 'bar'}>
<span>foo is equal to 'bar'</span>
<span>foo doesnt equal 'bar'</span>
</IfElse>
{/* is equivalent to */}
{foo === 'bar' ?
<span>foo is equal to 'bar'</span> :
<span>foo doesnt equal 'bar'</span>
}
<Switch>
<If v={foo === 'foo'}>
foo equals 'foo'
</If>
<If v={foo === 'bar'}>
else if foo equals 'bar'
</If>
<span>
else foo is not 'foo' or 'bar'
</span>
</Switch>
{/* no simple equivalent in vanilla jsx AFAIK */}
</div>
)
あなたは、これらのコンポーネントは、あまり明確とインライン構文未満正規のですが、私のために、彼らははるかに容易だと主張することがあり読む。特に、内側の構成要素が大きい場合。
私の初期の仮定は、これらのコンポーネントによって、まだ表示されていない子がレンダリングされ、結果が破棄されるということでしたが、確認しましたが、これは起こりません。
彼らはあまりにも真実であるように見えます。
{ myBoolExp && <MyComponent> }
または
{ myBoolExp ? <Mycomponent /> : <MyOtherComponent /> }
私はこれは、このように、プレーンJavaScriptをである事実によるものであると仮定し、それがあまり必要としますJSXで
彼らは問題がないところで解決しようとしています。そのロジックを別々の関数に抽象化するだけで、if/thenステートメントを心臓のコンテンツに使用することができます。 – Andy
または変数に条件付きでJSXを割り当て、それらを '{会社} 'としてレンダリングします –