2017-09-12 14 views
0

配列に追加するアイテムに使用できるプレースホルダーが5つあります。問題が発生すると、アイテムが追加されると消えてしまいます。アレイ。アイテムが配列に追加されたときにプレースホルダーを削除するReact

アイテムがアレイに追加されたときに番号付きプレースホルダを削除するにはどうすればよいですか?

https://codesandbox.io/s/qlp47q8j26

Hello.js

import React from 'react'; 
import update from 'immutability-helper' 
import styled from 'styled-components' 
import Product from './Product' 

const NumberWrap = styled.div` 
    display: flex; 
    flex-wrap:wrap 
    border: 1px solid #ccc; 
    flex-direction: row; 
` 

const Numbers = styled.div` 
    display:flex; 
    background: #fafafa; 
    color: #808080; 
    font-size: 32px; 
    flex: 0 0 20%; 
    min-height: 200px; 
    justify-content: center; 
    align-items:center; 
    border-right: 1px solid #ccc; 
` 

const CardWrap = styled.div` 
    display:flex; 
    flex-wrap: wrap; 
    flex-direction: row; 
    margin-top: 20px; 
` 

export default class Hello extends React.Component { 
    constructor() { 
    super() 
    this.state = { 
     placeholder: [1,2,3,4,5], 
     data: [ 
     { id: 1, header: 'Item 1'}, 
     { id: 2, header: 'Item 2'}, 
     { id: 3, header: 'Item 3'}, 
     { id: 4, header: 'Item 4'} 
     ], 
     addedItems: [], 
    } 
    } 

    handleAdd = (id) => { 
    this.setState({ 
     addedItems: update(this.state.addedItems, { 
     $push: [ 
      id, 
     ], 
     }) 
    }) 
    } 

    handleRemove = (id) => { 
    const index = this.state.addedItems.indexOf(id); 
    this.setState({ 
     addedItems: update(this.state.addedItems, { 
     $splice: [ 
      [index, 1] 
     ], 
     }) 
    }) 
    } 

    render() { 
    return(
     <div> 
     <NumberWrap> 
      { 
      this.state.placeholder.map(num => 
       <Numbers>{num} 
       { 
       this.state.data.filter(item => { 
        return this.state.addedItems.indexOf(item.id) === num - 1; 
       }).slice(0, 5).map(item => 
        <Product {...item} remove={() => { this.handleRemove(item.id) }} /> 
       ) 
       } 
       </Numbers> 
      ) 
      } 
     </NumberWrap> 


     <CardWrap> 
     { 
      this.state.data.map(item => 
      <Product 
       {...item} 
       add={()=> { 
       this.handleAdd(item.id) 
       }} 
      /> 
     )} 
     </CardWrap> 
     </div> 
    ) 
    } 
} 

Product.js

import React from "react"; 
import styled from "styled-components"; 

const Card = styled.div` 
    flex: 0 0 20%; 
    border: 1px solid #ccc; 
`; 

const Header = styled.div` 
    padding: 20px; 
`; 

const AddBtn = styled.button` 
    width:100%; 
    height: 45px; 
`; 

const Product = props => { 
    const { add, id, header, remove } = props; 
    return (
    <Card> 
     <Header key={id}> 
     {header} 
     </Header> 
     <AddBtn onClick={add}>Add</AddBtn> 
     <AddBtn onClick={remove}>Remove</AddBtn> 
    </Card> 
); 
}; 

export default Product; 
+0

。 – Panther

答えて

1

あなたはあなたの状態に追加の数字の配列を追加している場合にのみ番号をレンダリングする必要がありますこの配列には存在しません。

  1. 私はaddedArrayをコンストラクタの状態に追加しました。
  2. 変更されたhandleAddおよびhandleRemoveは、新しい配列 に項目を追加して追加します。

  3. レンダリング方法で{num}をレンダリングする条件が追加されました。

これはHello.jsコンポーネントのために変更されたコードです:あなたは `addedItems`に追加された項目の数を調べると、それらの多くのプレースホルダをスキップする必要が

import React from 'react'; 
import update from 'immutability-helper' 
import styled from 'styled-components' 
import Product from './Product' 

const NumberWrap = styled.div` 
    display: flex; 
    flex-wrap:wrap 
    border: 1px solid #ccc; 
    flex-direction: row; 
` 

const Numbers = styled.div` 
    display:flex; 
    background: #fafafa; 
    color: #808080; 
    font-size: 32px; 
    flex: 0 0 20%; 
    min-height: 200px; 
    justify-content: center; 
    align-items:center; 
    border-right: 1px solid #ccc; 
` 

const CardWrap = styled.div` 
    display:flex; 
    flex-wrap: wrap; 
    flex-direction: row; 
    margin-top: 20px; 
` 

export default class Hello extends React.Component { 
    constructor() { 
    super() 
    this.state = { 
     placeholder: [1,2,3,4,5], 
     addedArray: [], 
     data: [ 
     { id: 1, header: 'Item 1'}, 
     { id: 2, header: 'Item 2'}, 
     { id: 3, header: 'Item 3'}, 
     { id: 4, header: 'Item 4'} 
     ], 
     addedItems: [], 
    } 
    } 

    handleAdd = (id) => { 
    const nextAdded = [id,...this.state.addedArray]; 
    this.setState({ 
     addedArray: nextAdded, 
     addedItems: update(this.state.addedItems, { 
     $push: [ 
      id, 
     ], 
     }) 
    }) 
    } 

    handleRemove = (id) => { 
    const index = this.state.addedItems.indexOf(id); 
    const nextAdded = this.state.addedArray.filter(n => n != id); 
    this.setState({ 
     addedArray: nextAdded, 
     addedItems: update(this.state.addedItems, { 
     $splice: [ 
      [index, 1] 
     ], 
     }) 
    }) 
    } 

    render() { 
    return(
     <div> 
     <NumberWrap> 
      { 
      this.state.placeholder.map(num => 
       <Numbers> 
       {this.state.addedArray.filter(n=> n ==num).length == 0 && num} 
       { 
       this.state.data.filter(item => { 
        return this.state.addedItems.indexOf(item.id) === num - 1; 
       }).slice(0, 5).map(item => 
        <Product {...item} remove={() => { this.handleRemove(item.id) }} /> 
       ) 
       } 
       </Numbers> 
      ) 
      } 
     </NumberWrap> 


     <CardWrap> 
     { 
      this.state.data.map(item => 
      <Product 
       {...item} 
       add={()=> { 
       this.handleAdd(item.id) 
       }} 
      /> 
     )} 
     </CardWrap> 
     </div> 
    ) 
    } 
} 
関連する問題