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

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

如何從子組件 onClick 訪問父組件并 setState()

如何從子組件 onClick 訪問父組件并 setState()

德瑪西亞99 2023-11-11 20:52:25
我是一名年輕的開發人員,正在嘗試學習一些知識Reactjs,但我無法理解如何配置此 Todo 應用程序。我的目標是有一個按鈕,一旦輸入并提交,就會將項目添加到列表中。我覺得我已經很接近弄清楚了。我有一個應用程序組件(父級)、按鈕組件和一個列表組件(也是標題和項目組件)。該列表有一個變量,其中有一個空數組供我添加項目,我在我的應用程序組件中引用了該變量。問題就在這里。我的按鈕上有一個事件監聽器,它運行一個設置狀態的函數。每次單擊時我都會記錄該列表,這表明該數組正在接收文本輸入并創建一個新對象。然而,DOM 并沒有重新渲染,更讓我困惑的是,當我進行輕微編輯(隨機分號)時,DOM 渲染了我上次保存之前輸入和記錄的項目,但仍然沒有響應。我在這里缺少什么?另外,我知道生命周期方法如componentDidMount()或componentDidUpdate()可能有用,但我不完全理解如何以及在哪里使用它們。export class Button extends Component {constructor() {    super()    this.handleClick = this.handleClick.bind(this)}handleClick() {    const text = document.getElementById('text_field');    const input = text.value;            this.setState(() => {            TodoList.push({id: (TodoList.length+1), name: input})        })    console.log(TodoList)}render() {     return (        <div>            <div className='search-container'>                <input className='search' type='text' placeholder='type something...' id='text_field'></input>            </div>            <div className='button-container'>                <button type='submit' className='button-add' onClick={this.handleClick}> New Task </button>            </div>        </div>    )}}class App extends React.Component {constructor() {    super()    this.state = {        todos: TodoList    }}render() {    const todoItems = this.state.todos.map(todo => {        console.log(todo.name, todo.id);        return <Item desc={todo.name} key={todo.id} />     })        return(        <div className='wrapper'>            <div className='card'>                <Header numTodos={this.state.todos.length}/>                <div className='todo-list'>                    {todoItems}                </div>                <Button />            </div>        </div>    )}  } 導出默認應用程序
查看完整描述

1 回答

?
泛舟湖上清波郎朗

TA貢獻1818條經驗 獲得超3個贊

在您的 App.js 中,您應該將一個函數傳遞給<Button />,這種技術function as prop在 React 中調用。代碼App.js應如下所示:


class App extends React.Component {


constructor() {

    super()

    this.state = {

        todos: TodoList

    }

}


addTodo = (todo) => {

  this.setState({ todos: [...this.state.todos, todo] })

}


render() {

    const todoItems = this.state.todos.map(todo => {

        console.log(todo.name, todo.id);

        return <Item desc={todo.name} key={todo.id} /> 

    })

    

    return(

        <div className='wrapper'>

            <div className='card'>

                <Header numTodos={this.state.todos.length}/>

                <div className='todo-list'>

                    {todoItems}

                </div>

                <Button todosList={this.state.todos} addTodo={(todo) => this.addTodo(todo)} />

            </div>

        </div>

    )

}

在 的代碼中Button.js,您可以通過以下方式獲得此函數this.props


export default class Button extends Component {

constructor() {

    super()

    this.handleClick = this.handleClick.bind(this)

}


handleClick() {

    const text = document.getElementById('text_field');

    const input = text.value;

    this.props.addTodo({id: this.props.todosList.length + 1, name: input })

    console.log(this.props.todosList)

}


render() { 

    return (

        <div>

            <div className='search-container'>

                <input className='search' type='text' placeholder='type something...' id='text_field'></input>

            </div>

            <div className='button-container'>

                <button type='submit' className='button-add' onClick={this.handleClick}> New Task </button>

            </div>

        </div>

    )

}


查看完整回答
反對 回復 2023-11-11
  • 1 回答
  • 0 關注
  • 167 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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