" keyCombo"对象的定义如下所示,目的是在React组件的cat smb://server1/share1/textfile1 >> textfile2
方法中将数据呈现为样式线:
render
我想得到:
但相反,我得到了
let items = [{"keyCombo": ["⌘","0"]}, {"keyCombo": ["⌘","Ctrl", "1"]}]
tokbd = (keyCombo) => {
let styledKeys = keyCombo.map(key => <kbd>{key}</kbd>)
return <span>{styledKeys.join(" + ")}</span>
}
render() {
return(
<div>
{items.map(item => <span>{this.tokbd(item.keyCombo)}</span>)}
</div>
)
}
(和)
[object Object] + [object Object]
如何将[object Object] + [object Object] + [object Object]
数组中的字符组合成:
&#34;(样式元素)+(样式元素)+(样式元素)&#34;
而不是:
&#34;样式(元素+元素+元素)&#34;
即使keyCombo
字符也会无意中被设置为风格?
答案 0 :(得分:1)
join()方法将数组(或类数组对象)的所有元素连接成一个字符串并返回该字符串。 MDN这就是您获得[object Object]
的原因。
您可以尝试使用reduce而不使用第二个参数:
tokbd = (keyCombo) => {
let styledKeys = keyCombo.map(key => <kbd>{key}</kbd>).reduce((prev, curr) => [prev, ' + ', curr])
return <span>{styledKeys}</span>
}
<强> codesandbox 强>
答案 1 :(得分:0)
您还可以使用Object.entries将对象转换为[key,value]对的数组。然后,这允许您使用所有数组转换方法。
tokbd = (keyCombo) => {
return Object.entries(keyCombo).map(k => <kbd>{k[0].join(' + ')}</kbd>)[0]
}
答案 2 :(得分:0)
在对象数组上使用Array#join时,将调用每个项目的.toString()
方法。对象的.toString()
方法返回[object Object]
。
注意: tokbd
方法实际上应该是一个单独的组件。我已将组件命名为KeyCombo
。
选项1 - 插入+:
的CSS伪元素
const items = [{"keyCombo": ["⌘","0"]}, {"keyCombo": ["⌘","Ctrl", "1"]}]
const KeyCombo = ({ keyCombo }) => (
<div>{
keyCombo.map(key => <kbd key={key}>{key}</kbd>)
}</div>
)
const App = ({ items }) => (
<div>{
items.map((item, index) => <KeyCombo key={index} {...item} />)
}</div>
);
ReactDOM.render(
<App items={items} />,
demo
);
&#13;
kbd:not(:first-child)::before {
content: '+'
}
&#13;
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div id="demo"></div>
&#13;
选项2:为每个键创建一个数组,展平并切片最后一个
const items = [{"keyCombo": ["⌘","0"]}, {"keyCombo": ["⌘","Ctrl", "1"]}]
const KeyCombo = ({ keyCombo }) => (
<div>{
[].concat(...keyCombo.map(key => [
<kbd key={key}>{key}</kbd>,
<span key={`${key}+`}>+</span>
])).slice(0, -1)
}</div>
)
const App = ({ items }) => (
<div>{
items.map((item, index) => <KeyCombo key={index} {...item} />)
}</div>
);
ReactDOM.render(
<App items={items} />,
demo
);
&#13;
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div id="demo"></div>
&#13;