亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

array.splice(index, 1) 返回已刪除項目的數組

array.splice(index, 1) 返回已刪除項目的數組

偶然的你 2023-09-21 17:00:56
我正在學習 React hooks,我只是嘗試執行一個簡單的函數來從列表中刪除該項目。為此,我使用 find、indexOf 和 splice。在 onClick 函數中,我在 array.splice(indexOf, 1) 中使用 indexOf,但它僅返回列表中的項目。所有內容都會重新渲染并執行其應該執行的操作,但唯一渲染的項目是我剛剛嘗試刪除的項目。我缺少什么?const [todos, setToDo] = useState(initialToDo);const [input, setInput] = useState('');const todoList = (todos) => {    return (        todos.map((todo) => {        return (            <div className='todo-list flex p-2 w-1/2 justify-between'>                <p className="px-3">{todo.name}</p>                <button                     className='rounded-sm border-2 px-2'                    onClick={(e)=>{                        let item = todos.find(el=>el.id == todo.id);                        console.log(item)                        let index = todos.indexOf(item);                        console.log(index)                        todos = todos.splice(index, 1)                        // todos == item                        setToDo(todos)                    }}                    >-</button>            </div>    )}))}
查看完整描述

3 回答

?
守著星空守著你

TA貢獻1799條經驗 獲得超8個贊

是的,Array.splice返回刪除的元素并改變原始數組,這意味著您可以用來index 從列表中刪除/更新待辦事項todos。

執行此操作的最簡單方法是以下方法。這是工作示例

const todoList = () => {

  const [todos, setToDo] = useState(initialToDo);

  const [input, setInput] = useState('');


  const handleDelete = index => {

    todos.splice(index, 1)

    setToDo([...todos])

  }


  return (

    todos.map((todo, index) => {

    return (

      <div className='todo-list flex p-2 w-1/2 justify-between'>

        <p className="px-3">{todo.name}</p>

        <button 

          className='rounded-sm border-2 px-2'

          onClick={() => handleDelete(index)}    

        >

        -

       </button>

      </div>

  )}))

}


查看完整回答
反對 回復 2023-09-21
?
慕慕森

TA貢獻1856條經驗 獲得超17個贊

使用filter而不是使用 進行變異splice。試試這個片段。


const TodoList = () => {

  const [todos, setTodos] = React.useState([

    { name: 'a', id: 1 },

    { name: 'b', id: 2 },

  ]);

  return todos.map((todo) => {

    return (

      <div>

        <p>{todo.name}</p>

        <button onClick={() => setTodos(todos.filter(item => item.id !== todo.id))} > - </button>

      </div>

    );

  });

};


const domContainer = document.querySelector('#app');

ReactDOM.render(<TodoList />, domContainer);

<script crossorigin src="https://unpkg.com/react@17/umd/react.production.min.js"></script>

<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script>


<div id="app"> </div>


查看完整回答
反對 回復 2023-09-21
?
陪伴而非守候

TA貢獻1757條經驗 獲得超8個贊

splice返回已刪除的項目。我建議使用filter類似的東西:

setToDo(todos.filter(({ id }) => id != todo.id));


查看完整回答
反對 回復 2023-09-21
  • 3 回答
  • 0 關注
  • 213 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號