Я не могу заставить его работать не очень хорошо, если я использую индекс в качестве ключа. Единственный способ, если я изменю массив и , использую индекс в качестве ключа. Но так как документы говорят, что не нужно изменять состояние (массив), поэтому, если это так, я не могу заставить его работать не так, как утверждают документы. Как я могу показать, что он может сломаться?
function App() {
const [arr, setArr] = React.useState(["A","B","C"]);
function toggleSortOrder() {
let newArr = [...arr];
newArr.reverse();
console.log(JSON.stringify(newArr));
setArr(newArr);
}
return (
<div>
<ul>
{ arr.map((e, i) => <li key={i}>{ e }</li>) }
</ul>
<button onClick={toggleSortOrder} >Toggle Sort Order</button>
</div>
)
}
ReactDOM.render(<App />, document.querySelector("#root"));
<script src="https://unpkg.com/react@16.12.0/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@16.12.0/umd/react-dom.development.js" crossorigin></script>
<div id="root"></div>
Я могу разорвать его, если изменю состояние, которое, по словам документации, не должно выполняться:
function App() {
const [arr, setArr] = React.useState(["A","B","C"]);
function toggleSortOrder() {
arr.reverse();
console.log(JSON.stringify(arr));
setArr(arr);
}
return (
<div>
<ul>
{ arr.map((e, i) => <li key={i}>{ e }</li>) }
</ul>
<button onClick={toggleSortOrder} >Toggle Sort Order</button>
</div>
)
}
ReactDOM.render(<App />, document.querySelector("#root"));
<script src="https://unpkg.com/react@16.12.0/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@16.12.0/umd/react-dom.development.js" crossorigin></script>
<div id="root"></div>
Но я даже не могу сломать его, если я изменяю состояние и использую индекс в качестве ключа, если это компонент класса:
class App extends React.Component {
state = { arr: ["A","B","C"] };
toggleSortOrder() {
this.state.arr.reverse();
console.log(JSON.stringify(this.state.arr));
this.setState({ arr: this.state.arr });
}
render() {
return (
<div>
<ul>
{ this.state.arr.map((e, i) => <li key={i}>{ e }</li>) }
</ul>
<button onClick={this.toggleSortOrder.bind(this)} >Toggle Sort Order</button>
</div>
);
}
}
ReactDOM.render(<App />, document.querySelector("#root"));
<script src="https://unpkg.com/react@16.12.0/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@16.12.0/umd/react-dom.development.js" crossorigin></script>
<div id="root"></div>