2017-05-08 58 views
1

我想從狀態中刪除項目。如何使用鍵從狀態中刪除項目

我有key id(如this.props.result._id)想要刪除。

我想運行此函數作爲fetchtrash函數)中的.then的結果。

這是如何實現的?

class Data extends React.Component { 
    render(){ 
    const { hits } = this.props 
    this.components = [] 
    return (
     <div> 
     {hits.map(hit => 
      <ItemResult ref={ref => this.components.push(ref)} 
      key={hit._id} result={hit} />)} 
     </div> 
    ) 
    } 
} 

class ItemResult extends React.Component { 
constructor(props) { 
    super(props); 
    this.deleteItem = this.deleteItem.bind(this); 
    this.state = { 
     item: props.result, 
    }; 
    } 
    deleteItem = event => { 
    // console.log('This gives undefined', item) 
    this.setState({ 
     item: [] 
    }) 
    } 
    render() { 
    return (
     <div> 
     <button onClick={this.deleteItem.bind(this)}> Delete </button> 
      <h2> This appears {this.props.result.title}</h2>    
    </div> 
    ); 
    } 
} 

回答

0

您不能刪除props密鑰。有你的情況下,兩個辦法:

  1. 呼叫從自己的父組件的任何回調(你在哪裏指定此道具)和刪除/修改它有
  2. 但它會更好,如果你在一個訂貨量大這個道具組件的state。然後,您可以按照自己的意願對其進行操作,並且不會傳遞給道具。
0

關鍵是更多的內部反應屬性。如果我是你,我可能會這樣做的方式是在每個元素上創建一個動態ID,然後在試圖刪除它時解決該特定ID。

class Data extends React.Component { 
    render(){ 
const { hits } = this.props 
this.components = [] 
return (
    <div> 
    {hits.map(hit => 
     <ItemResult ref={ref => this.components.push(ref)} 
     key={hit._id} id="{'hitNum' + hit._id}" result={hit} />)} 
    </div> 
    ) 
    } 
} 

class ItemResult extends React.Component { 
constructor(props) { 
    super(props); 

    this.state = { 
    }; 
    } 
    render() { 
    const { result } = this.props 
    return (
     <div key={result._id}> 
      <h1>{result._source.title}</h1> 
      <DeleteButon/> 
     </div> 
    ); 
    } 
} 

class DeleteButon extends React.Component { 
    constructor(props) { 
    super(); 
    this.state = { 
    } 
    } 

    trash() { 
    return fetch(DATA_API + this.props.result._id + '/', { 
    method: 'PUT', 
    body: JSON.stringify({deleted:true})}) 
     .then(function(res){ return res.json(); }) 
      //.then remove the id={'hitNum' + hit._id} it belongs to in ItemResult 
    } 
    render() { 
    return (
    <button className="trash" onClick={this.trash} > 
    Delete item # {this.props.result._id} 
    </button> 
    ); 
    } 
} 
+0

謝謝,但它看起來像你剛剛粘貼我的代碼。你能不能用實際的代碼來說明這是如何完成的? – Ycon

+0

我稍微補充了你的代碼!當你創建實際的反應元素時,請檢查一下,你正在添加一個獨特的ID,一般以hitNum開頭,然後連接任何id。然後可以在.then函數中稍後訪問它,以實際刪除要刪除的特定元素。 –

+0

請給出一個完整的例子,顯示.then函數將其刪除 - 謝謝 – Ycon

0

解決使用React是回調向下傳遞到組件的改變你的父母的問題的慣用方式。

所以定義DeleteButton組件時,它可能是這樣的:

<DeleteButton onDelete={() => console.log('handle delete')} /> 

如果你想改變,雖然道具..

那麼你可能要觸發重新呈現帶有不同道具的父母被傳遞下來。這就是React蓬勃發展的原因。信息的單向流動。如果移除一個ItemResult改變某個中央狀態,那麼所有道具都來自該中央狀態,您可以簡單地導致組件重新渲染,並且會有一套新的道具,但缺少所需的ItemResult

閱讀..

+0

你能提供一個回調來做到這一點嗎?我沒有使用也不熟悉REDX – Ycon

+0

冒着它損失我寶貴的聲譽,我寧願你先去看看它,然後我提供了指針。Redux有點過分了,這是一個小應用程序,但如果你的應用程序可能會擴展,它會非常強大;此外,它目前主要是React的行業標準。 – christopher

+0

當然,我根據你的建議編輯了我的回答,然後回電但我沒有成功。你可以請審查? – Ycon