第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

復(fù)選框在反應(yīng) js 中的待辦事項(xiàng)中不起作用

復(fù)選框在反應(yīng) js 中的待辦事項(xiàng)中不起作用

繁花如伊 2023-05-19 14:40:30
我正在使用復(fù)選框?qū)崿F(xiàn) Todo。我在該州有一個(gè) id、content、status 屬性。Status 有 3 種狀態(tài)(pending、done、deleted)。待辦事項(xiàng)列表有一個(gè)復(fù)選框。如果狀態(tài)為待定,則不應(yīng)選中復(fù)選框。如果狀態(tài)為完成,則應(yīng)選中復(fù)選框。默認(rèn)情況下,狀態(tài)為待定。應(yīng)根據(jù)狀態(tài)選中/取消選中復(fù)選框。在刪除待辦事項(xiàng)時(shí),狀態(tài)應(yīng)更新為已刪除?,F(xiàn)在我對(duì)復(fù)選框的實(shí)現(xiàn)感到震驚。它沒(méi)有按照要求工作。應(yīng)用程序.js:import React from 'react';import Todo from './Todo';import AddTodo from './AddTodo';class App extends React.Component{  state={   todos:[   {id:1,content:'Buy milk1',status:'pending'},   {id:2, content:'buy carrots1', status: 'pending'},   {id:3,content:'Buy milk2',status:'done'},   {id:4, content:'buy carrots2', status: 'deleted'}  ]}onDelete=(id)=>{ const todo = this.state.todos.find((todoItem => todoItem.id === id)) todo.status ='deleted'; this.setState([...this.state.todos]);}onChangeCheckbox=(id, checked)=>{  const todo = this.state.todos.find((todoItem => todoItem.id === id)) if(checked){  todo.status = 'done' } else{  todo.status = 'pending' } this.setState([...this.state.todos]); }addTodo=(todo)=>{ todo.id=Math.random(); todo.status = "pending"; let todos=[...this.state.todos,todo]; this.setState({todos});}render(){ return(  <div>    <h1>Todo's App</h1>        <AddTodo addTodo={this.addTodo} />    <Todo todos={this.state.todos} deleteTodo={this.onDelete} onChangeCheckbox=     {this.onChangeCheckbox} />   </div>  ) }}export default App;
查看完整描述

3 回答

?
慕村9548890

TA貢獻(xiàn)1884條經(jīng)驗(yàn) 獲得超4個(gè)贊

您的代碼存在一些問(wèn)題。onDelete最大的問(wèn)題是您的、onChangeCheckbox和處理程序中的狀態(tài)突變addTodo。這些處理程序也不正確地不存儲(chǔ)todos數(shù)組。


使用功能狀態(tài)更新并將現(xiàn)有狀態(tài) todos 數(shù)組映射到新數(shù)組,并復(fù)制todo與 id 匹配的項(xiàng)目,這樣您就不會(huì)改變狀態(tài)對(duì)象。


Math.random 生成浮點(diǎn)數(shù),因此很難與===. 我改為為每個(gè)添加一個(gè) guid。


class App extends React.Component {

  state = {

    todos: [

      { id: uuidV4(), content: "Buy milk1", status: "pending" },

      { id: uuidV4(), content: "buy carrots1", status: "pending" },

      { id: uuidV4(), content: "Buy milk2", status: "done" },

      { id: uuidV4(), content: "buy carrots2", status: "deleted" }

    ]

  };


  onDelete = (id) => {

    this.setState((prevState) => ({

      todos: prevState.todos.map((todo) =>

        todo.id === id

          ? {

              ...todo,

              status: "deleted"

            }

          : todo

      )

    }));

  };


  onChangeCheckbox = (id, checked) => {

    this.setState((prevState) => ({

      todos: prevState.todos.map((todo) =>

        todo.id === id

          ? {

              ...todo,

              status: checked ? "done" : "pending"

            }

          : todo

      )

    }));

  };


  addTodo = (todo) => {

    this.setState((prevState) => ({

      todos: [

        ...prevState.todos,

        {

          ...todo,

          id: uuidV4(),

          status: "pending"

        }

      ]

    }));

  };


  render() {

    return (

      <div>

        <h1>Todo's App</h1>


        <AddTodo addTodo={this.addTodo} />

        <Todo

          todos={this.state.todos}

          deleteTodo={this.onDelete}

          onChangeCheckbox={this.onChangeCheckbox}

        />

      </div>

    );

  }

}

也不需要存儲(chǔ)任何checked狀態(tài),Todo.js因?yàn)闄z查狀態(tài)很容易從您的todo.status財(cái)產(chǎn)中派生出來(lái)。如果狀態(tài)為“完成”,則選中該框。


todos您可以(應(yīng)該)首先通過(guò)過(guò)濾器運(yùn)行您的數(shù)組以刪除已刪除的狀態(tài)待辦事項(xiàng)。


const Todo = ({ todos, deleteTodo, onChangeCheckbox }) => {

  const todoList = todos.length ? (

    todos

      .filter(({ status }) => status !== "deleted")

      .map((todo) => {

        return (

          <div key={todo.id}>

            <div>

              <input

                type="checkbox"

                checked={todo.status === "done"}

                onChange={(event) =>

                  onChangeCheckbox(todo.id, event.target.checked)

                }

              />

              <p

                style={

                  todo.status === "pending"

                    ? { color: "red" }

                    : { color: "green", textDecoration: "line-through" }

                }

              >

                {todo.content}

              </p>

              <button onClick={() => deleteTodo(todo.id)}>Delete</button>

            </div>

            <hr />

          </div>

        );

      })

  ) : (

    <p>You have no todos</p>

  );

  return <div>{todoList}</div>;

};


查看完整回答
反對(duì) 回復(fù) 2023-05-19
?
回首憶惘然

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超11個(gè)贊

checked對(duì)于每個(gè)項(xiàng)目,您只有一個(gè)狀態(tài)todo。我建議您為列表checked中的每個(gè)項(xiàng)目添加狀態(tài)todos。然后你可以找到項(xiàng)目并相應(yīng)地改變狀態(tài)



查看完整回答
反對(duì) 回復(fù) 2023-05-19
?
慕工程0101907

TA貢獻(xiàn)1887條經(jīng)驗(yàn) 獲得超5個(gè)贊

發(fā)生這種情況是因?yàn)槟屵x中狀態(tài)監(jiān)聽(tīng)current component state而不是項(xiàng)目狀態(tài)。而且它們不同步。所以你有兩個(gè)解決方案。首先將狀態(tài)值作為道具傳遞給已檢查狀態(tài),以便在狀態(tài)值更新時(shí)讓狀態(tài)發(fā)生變化,我認(rèn)為它更昂貴。我有其他完全沒(méi)有狀態(tài)的建議。


 // const [checked, setChecked] = useState(false); remove that, you no longer need it


 const handleInputChange =(event,id,status)=>{ 

   let isChecked = status=='pending' ? true: false;

   onChangeCheckbox(id, isChecked);

 }

同時(shí)更新輸入檢查狀態(tài)


<input

    type="checkbox"

    checked={todo.status === 'pending' ? false : true}

    onChange= {(event)=>handleInputChange(event,todo.id,todo.status)}

 />

https://codesandbox.io/s/competent-hugle-jn22o?file=/src/Todo.js


查看完整回答
反對(duì) 回復(fù) 2023-05-19
  • 3 回答
  • 0 關(guān)注
  • 174 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)