3 回答

TA貢獻1779條經驗 獲得超6個贊
首先,您需要正確渲染,這意味著循環所有鍵(汽車制造商),然后循環所有屬性/值對。您可以使用解構數組來簡化此操作
Object.entries(someObject).map( ([key,value]) => .... )
繼承人渲染:
render() {
return Object.entries(this.state.data).map(([maker, props]) => {
return (
<div>
<h2>{maker}</h2>
{Object.entries(props).map(([key, value], index) => {
return (
<div>
{key}:{" "}
<input
key={index}
onChange={this.handleChange(maker, key)}
defaultValue={value}
/>
</div>
);
})}
</div>
);
});
}
您會注意到我更改了您的handleChange方法來傳遞汽車制造商和正在編輯的屬性 - 這可以傳遞到setData:
// To update the state model with changed values
setData = (maker, key, val) => {
this.setState((state) => ({
data: {
...state.data,
[maker]: {
...state.data[maker],
[key]: val
}
//Don't know how to map to state properly! Now you do!
}
}));
};
// Handle input change
handleChange = (maker, key) => (e) => {
this.setData(maker, key, e.target.value);
};
實時工作示例:https ://codesandbox.io/s/react-playground-forked-dw9sg

TA貢獻1797條經驗 獲得超4個贊
您首先沒有從輸入回調傳遞鍵和事件對象,您的代碼應該是這樣的,
顯示邏輯在我看來是錯誤的,
Object.entries(this.state.data).map((x, index) =>
/*
here x is an array and it looks like
["audi", {engine: '2.5', gearbox: 'auto', fuel: 'petrol}
*/
// You need to access the data in the second index
// if you want to print each value of the object
<p>x[1].engine</p>
<p>x[1].gearbox</p>
<p>x[1].fuel</p>
// Render each KPV in object
{x[0]}: <input key={index} onChange={(e) => this.handleChange(x[0], e)} value={x[1].engine}/>
)
回調handleChange應該看起來像,不要柯里化它們。
handleChange = (key, e) => {
this.setData(key, e.target.value);
};
我建議使用 lodash 的castArray之類的實用程序,https://lodash.com/docs/4.17.15#castArray將對象轉換為數組,以便您可以輕松使用它。

TA貢獻1943條經驗 獲得超7個贊
class App extends React.Component {
constructor(props) {
super(props)
this.state = {
data: {
audi: { model: "A7", transmission: "AT" },
merc: { model: "GLA", transmission: "MT" },
bmw: { model: "M3", transmission: "AT" },
},
}
}
update(make, detail, value) {
let data = this.state.data
data[make][detail] = value
console.log(`Updating ${make} ${detail} with ${value}`)
this.setState({ data: data })
}
handleChange(make, detail) {
return e => { this.update(make, detail, e.target.value) }
}
renderDetails(details) {
return details.map(d => (<div><span>{d.key}:</span> <input value={d.model} onChange={this.handleChange(d.key, "model")} /> <input value={d.transmission} onChange={this.handleChange(d.key, "transmission")} /></div>))
}
render() {
const details = Object.entries(this.state.data).map(d => ({ key: d[0], ...d[1] }))
return <div>{this.renderDetails(details)}</div>
}
}
ReactDOM.render((<App />), document.getElementById("app"))
body { font-family: monospace; }
span { display: block; font-weight: bold; }
input { width: 50px; }
<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>
<div id="app"></div>
添加回答
舉報