Array.joinのような構文を使用して、配列の各要素の間にセパレータを挿入したいと思います。
次のようなもの:
_render() {
let myArray = [1,2,3];
return (<div>
{myArray.map(item => <div>{item}</div>).join(<div>|</div>)}
</div>);
}
_
Lodash.transformアプローチを使用してそれを機能させていますが、見苦しいので、.join(<some-jsx>)
を実行して、各項目の間にセパレーターを挿入します。
reduce
を使用して、配列のすべての要素の間にセパレータを挿入することもできます。
render() {
let myArray = [1,2,3];
return (
<div>
{
myArray
.map(item => <div>{item}</div>)
.reduce((acc, x) => acc === null ? [x] : [acc, ' | ', x], null)
}
</div>
);
}
またはフラグメントを使用する:
render() {
let myArray = [1,2,3];
return (
<div>
{
myArray
.map(item => <div>{item}</div>)
.reduce((acc, x) => acc === null ? x : <>{acc} | {x}</>, null)
}
</div>
);
}
React Elementsで.joinを実行しようとすると、おそらくあなたのためにうまくいきません。これは、あなたが必要とする結果を生み出すでしょう。
render() {
let myArray = [1,2,3];
return (
<div>
{myArray.map((item, i, arr) => {
let divider = i<arr.length-1 && <div>|</div>;
return (
<span key={i}>
<div>{item}</div>
{divider}
</span>
)
})}
</div>
);
}
.reduce
とReact
fragments を組み合わせて実行することもできます。
function jsxJoin (array, str) {
return array.length > 0
? array.reduce((result, item) => <>{result}{str}{item}</>)
: null;
}
function jsxJoin (array, str) {
return array.length > 0
? array.reduce((result, item) => <React.Fragment>{result}{str}{item}</React.Fragment>)
: null;
}
const element = jsxJoin([
<strong>hello</strong>,
<em>world</em>
], <span> </span>);
ReactDOM.render(element, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.4.1/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.4.1/umd/react-dom.production.min.js"></script>
<div id="root"></div>
ところで反応する関数を提供することもできます。私のアプローチはPush(value); Push(glue);
の_.forEach
_ペアであり、その後にpop()
が末尾の接着剤となります...
_function() {
joinLike = [];
originData.forEach(function(v,i) {
joinLike.Push(v);
joinLike.Push(<br>);
})
joinLike.pop();
return joinLike;
}
_
Array.map
およびReact.Fragment
を使用すると、各配列項目を任意のJSX要素と結合できます。以下の例では<br />
タグを使用していますが、これは任意の要素に置き換えることができます。
const lines = ['line 1', 'line 2', 'line 3'];
lines.map((l, i) => (
<React.Fragment key={i}>{l}{i < (lines.length - 1) ? <br /> : ''}</React.Fragment>
));
出力は
line 1 <br />
line 2 <br />
line 3
flatMap()
を試すこともできます。ブラウザのサポートが近づいていますが、それまではポリフィルを使用できます。唯一の欠点は、最後の要素を失う必要があることです。
例えば。
{myArray.flatMap(item => [<div>{item}</div>, <div>|</div>]).slice(0, -1)}
または
{myArray.flatMap((item, i) => [
<div>{item}</div>,
i < myArray.length - 1 ? <div>|</div> : null
])
このような関数を使用できます
function componentsJoin(components, separator) {
return components.reduce(
(acc, curr) => (acc.length ? [...acc, separator, curr] : [curr]),
[]
);
}
または、これを見つけたパッケージを使用できます https://www.npmjs.com/package/react-join
要求されたソリューションを作成するには、React joinはmapおよびreduceでは機能しないようです。次のように実行できます。
render() {
let myArray = [1, 2, 3];
return (
<div>
{myArray
.map(item => <div>{item}</div>)
.reduce((result, item) => [result, <div>|</div>, item])}
</div>
);
}