개체 배열이 있습니다. 각 객체는 제품을 나타내며이 배열에서 추가되고 제거되며 DOM은이를 올바르게 반영합니다. 문제는 DOM이이 업데이트를 반영하지 않는 객체의 속성 중 하나를 업데이트 할 때입니다.React 구성 요소 DOM이 업데이트되지 않습니다.
import React from 'react'
import './App.css'
var stack = React.createClass ({
getInitialState() {
return {order: []};
},
AddToOrder(amount, product) {
var order = this.state.order, isInOrder = false;
order.map((object, i) => {
if (object.productId === product.productId) {
object.amount = product.amount + amount; //This change doesn't show
isInOrder = true;
}
return;
})
if (!isInOrder) {
product.amount = amount;
order.push(product); //This change is updated
}
this.setState({order: order});
},
render() {
return (
<table>
{<OrderRow products={this.state.order}/>}
</table>
)
}
})
class OrderRow extends React.Component {
render() {
return (
<tbody>
{this.props.products.map((object, i) => {
return <tr key={i}>
<td> {object.name}</td>
<td>
<input
type='number' defaultValue={object.amount} /> //This doesn't update in DOM when I change the products amount in stack component
</td>
</tr>;
})}
</tbody>
);
}
}
export default stack;
이 예에서 "ChangeName"기능 변경 사항은 DOM에 반영됩니다. 왜 이런거야?
import React from 'react'
import './App.css'
var stack = React.createClass ({
getInitialState() {
return {order: []};
},
AddToOrder(amount, product) {
var order = this.state.order;
var isInOrder = false;
order.map((object, i) => {
if (order[i].productId === product.productId) {
order[i].amount = product.amount + amount; //This change doesn't show
isInOrder = true;
}
return;
})
if (!isInOrder) {
product.amount = amount;
order.push(product); //This change is updated
}
this.setState({order: order});
return;
},
changeName() {
var order = this.state.order;
order[0].name = "name changed"; //Make sure there is one object in order
this.setState({order: order});
},
render() {
return (
<table>
{<OrderRow products={this.state.order}/>}
</table>
)
}
})
class OrderRow extends React.Component {
render() {
return (
<tbody>
{this.props.products.map((object, i) => {
return <tr key={i}>
<td> {object.name}</td>
<td>
<input
type='number' defaultValue={object.amount} />
</td>
</tr>;
})}
</tbody>
);
}
}
안녕하세요, AddToOrder 함수 끝에 forceupdate를 사용했지만 입력 값 defaultValue를 업데이트하지 않았습니다. – Waltari