#javascript #reactjs #material-ui #material-table
#javascript #reactjs #материал-пользовательский интерфейс #material-table
Вопрос:
Довольно новичок в JS, реагирует. Попытка использовать Material-table с помощью кнопки добавления строки. Добавление строки не добавит строку. При обновлении строки сбрасываются. Я почти уверен, что делаю что-то не так с настройкой / обновлением состояния.
export default function App() {
return (
<div className="App">
<Tabl
obj={{
a: "a",
items: [{ x: 1 }, { x: 2 }, { x: 3 }]
}}
/>
</div>
);
}
class Tabl extends Component {
constructor(props) {
super(props);
this.state = {
obj: props.obj
};
console.log(JSON.stringify(this.state.obj));
}
updateState(newData) {
this.setState({
obj: [...this.state.obj.items, newData]
});
}
render() {
const currObj = this.state.obj;
const column = [
{
title: "a",
field: "x"
}
];
const tableIcons = {
Add: forwardRef((props, ref) => <AddBox {...props} ref={ref} />),
Check: forwardRef((props, ref) => <Check {...props} ref={ref} />),
Clear: forwardRef((props, ref) => <Clear {...props} ref={ref} />)
};
return (
<MaterialTable
data={currObj.items}
columns={column}
icons={tableIcons}
options={{
search: false,
paging: false
}}
editable={{
onRowAdd: (newData) =>
new Promise((resolve, reject) => {
setTimeout(() => {
this.updateState(newData);
resolve();
}, 1000);
})
}}
/>
);
}
}
export default Tabl;
Заранее спасибо.
Комментарии:
1.
updateState
похоже, что defenitely обновляет состояние. Но я считаю, что следующий рендеринг использует старое состояние, а не обновленное состояние
Ответ №1:
метод this.updateState не привязан к классу.
Вы можете привязать конструктор следующим образом,
constructor(props) {
super(props);
this.state = {
obj: props.obj
};
console.log(JSON.stringify(this.state.obj));
this.updateState= this.updateState.bind(this);
}
Комментарии:
1. Ваша модель состояния — {a: ‘..’, items: […] }, и вы пытаетесь изменить obj: […this.state.items, newData] . Возможно, это могло бы сработать следующим образом -> obj : {…this.state.obj, items: […this.state.items, newData]}
2. Спасибо за подсказку.
obj: { ...this.state.obj, items: [...this.state.obj.items, newData] }
сработало.