2017-06-15 95 views
0

我試圖從我的狀態中刪除值。從狀態中刪除值(設置新狀態)

我使用.filter,因爲我相信這是最簡單的方法。我也想實現一個undo函數(但這超出了這個問題的範圍)。

我已經把這個代碼在沙箱中 https://codesandbox.io/s/yrwo2PZ2R

class App extends React.Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     movies: x.movies, 
    }; 
    } 
remove = (e) => { 
    e.preventDefault(); 
    console.log('remove movie.id:', e.target.value) 
    const index = e.target.value 
    this.setState({ 
    movies: this.state.movies.filter((_, e) => e.id !== index) 
    }); 
} 
    render() { 
    return (
     <div> 
     {this.state.movies.map(e => 
      <div key={e.id}> 
      <li>{e.name} {e.id}</li> 
      <button value={e.id} onClick={this.remove}>remove</button> 
      </div>, 
     )} 
     </div> 
    ); 
    } 
} 

回答

2

兩個問題。

首先,您從事件目標值獲得的索引是一個字符串,但是您正在與一個數字進行比較。更改索引聲明如下:

const index = Number(e.target.value); 

其次,您的過濾器是有點關閉。這將工作:

this.state.movies.filter(movie => movie.id !== index) 
0

可以實現以下方式

remove = (e) => { 
    e.preventDefault(); 
    console.log('remove movie.id:', e.target.value) 
    const index = e.target.value 
    var movies = [...this.state.movies] 
    var idx = movies.findIndex((obj) => obj.id === parseInt(index)) 
    movies.splice(idx, 1); 

    this.setState({ 
    movies 
    }); 
} 

還可以使用parseInt函數在比較之前指數轉換爲字符串相同。 由於setState是異步的,因此直接從以前的狀態值設置當前狀態可能會導致問題。理論上,應該創建對象的副本,並刪除使用對象拼接方法

CODESANDBOX

+0

這告訴我'findIndex'不是一個函數。你能在這個例子中試試嗎? https://codesandbox.io/s/yrwo2PZ2R – Ycon

+0

沒有。這是刪除底部項目(不是我點擊的具體項目) – Ycon

+0

不知道這是解決問題的好方法。我的意思是使用'=='而不是'==='。類型轉換是更爲明顯的解決方案。如果你有明確的類型轉換,重構錯誤的概率就會降低。 –

1

問題是index具有字符串類型,但在ID對象具有number類型。你需要類型轉換,例如:

const index = Number(e.target.value); 

其他,你filter函數調用的回調有一些錯誤_。你不需要它。您需要:

this.state.movies.filter(e => e.id !== index) 

順便說一句,我不建議這樣命名值。爲什麼e?你有一系列的電影。使用movie。爲什麼index?你有id要刪除。然後使用idToRemove名稱。

您也有添加項目的問題。

首先,你可以添加項目是這樣的:

this.setState({ 
    movies: [...this.state.movies, { name: item.value.name, id: item.value.id }], 
}) 

還有一點:你必須自動增量ID。您可以將最後一個值存儲在變量中。例如,this.idCounter。而添加的樣子:

this.setState({ 
    movies: [...this.state.movies, { name: item.value.name, id: this.idCounter++ }], 
}) 

例子:https://codesandbox.io/s/2vMJQ3p5M

+0

你可以在代碼沙箱中顯示我嗎?我曾是 。無法應用您的示例。 https://codesandbox.io/s/yrwo2PZ2R。我認爲是第52行添加了this.props.addItem(this.state);' – Ycon

+0

我再次更新了答案,所以現在它已滿(您不能接受它,因爲@SamHH答案是第一個)。我添加了一些關於變量名稱的建議+它有一部分關於添加元素。 –

+0

實現你想要的另一種方式是「不嚴格的平等」。但我不確定使用它是個好主意。它更隱含。這不好。 –