在 React Hookstate 中更新数组元素
2021-07-21
852
我有一个使用 React Hookstate 的应用程序。 对于一个状态,我使用一个数组。我想更新此数组中的单个元素。 但更新的元素始终包装在代理标记内。
import React from 'react';
import { useState, none, State } from '@hookstate/core';
const Test: React.FC = () => {
const books: State<Array<any>> = useState([
'Harry Potter',
'Sherlock Holmes',
'Swiss Family Robinson',
'Tarzon',
]);
const SwapItems = () => {
// books.merge((p) => ({ 1: p[0], 0: p[1] })); // this way it works.
const reOrderedItem = books.nested(0);
books.nested(0).set(none);
books.set((p) => {
p.splice(0, 0, reOrderedItem);
return p;
});
};
return (
<div>
<ol>
{books.map((book) => {
return <li>{book.get()}</li>;
})}
</ol>
<br />
<button onClick={SwapItems}>Swap Books</button>
</div>
);
};
export default Test;
//error react-dom.development.js:11393 Uncaught RangeError:超出最大调用堆栈大小。
2个回答
我很确定您只需添加
.value
,如下所示:
const reOrderedItem = books.nested(0).value;
我不确定您为什么不喜欢
update
版本,尽管它似乎简单得多。
或者,如果您想使用
set
,为什么不直接使用这些项目?
const reOrderedItem = books.nested(0).value;
books.nested(0).set(books.nested(1).value);
books.nested(1).set(reOrderedItem);
或者,您可以像这样在
set
内进行操作(但您说得对,这对于大型数组来说效率低下):
const SwapItems = () => {
books.set((p) => {
const [a, b, ...rest] = p;
return [b, a, ...rest];
});
};
edemaine
2021-07-21
实际上,我想重新排序列表中的某个项目。
import React from 'react';
import { useState, State } from '@hookstate/core';
const Test: React.FC = () => {
const books: State<Array<any>> = useState([
'Harry Potter',
'Sherlock Holmes',
'Swiss Family Robinson',
'Tarzon',
]);
const ReorderItems = () => {
books.set((p) => {
const reOrderedItem = p[2];
p.splice(2, 1);
p.splice(0, 0, reOrderedItem);
return p;
});
};
return (
<div>
<ol>
{books.map((book) => {
return <li>{book.get()}</li>;
})}
</ol>
<br />
<button onClick={ReorderItems}>Swap Books</button>
</div>
);
};
export default Test;
bhagya oshadhi
2021-07-22