Reactで、フィルター機能を作成しています。
現在、2つの大きな問題があります。
1. ラジオボタンが選択できません。クリックして反応させることはできるのですが、アクティブにならないのです。初期状態のstateをfalseにし、selectしたらtrueになるように設定たらいいのではと思ったのですが、それも上手く動きません。
2. JSONデータを、ラジオボタンのvalueに応じてフィルターしようとしています。let filteredItemを作成し、その中に、大元のJSONデータを、ラジオボタンのvalueでフィルターし、そのデータをpropsとして通そうとしています。
しかし、1回目のクリックでは上手く動くのですが、2回目に別のボタンをクリックすると、filteredItem は空になってしまいます(何の値も入っていない)。どうしたら、フィルター済みのJSONデータをstateに入れ、それをpropsとしてItemコンポーネントに渡すことが出来るのでしょうか。
よろしくお願いします。
import fashion from '../data/fashion.json'; class App extends React.Component { state = { products: fashion } updateItem = (filter) => { this.setState({ products: fashion}) let filteredItem = this.state.products.slice(); let products = filteredItem.filter(item => { if (item.category === filter || item.size === filter) { return true; } }); this.setState({ products: products }) console.log(products); } render() { return ( <div className="wrapper"> <div className="sidebar"> <SideBar onClick = {this.updateItem} items = {this.state.products} /> </div> <main> <Item items = {this.state.products} /> </main> </div> ); } }
export default App; class SideBar extends React.Component { constructor(props) { super(props); this.state = { checked: false } } getValue = (event) => { // console.log("Get value", event.target.value); // Trigers updateItem() on App Component this.props.onClick(event.target.value); } toggleChecked = () => { if(this.state.checked===false) { this.setState({ checked: !this.state.checked }); console.log("toggleChecked", this.state.checked); } } render() { return ( <div> <ul className="category_list"> <li> <input type="radio" value="shirt" checked={this.toggleChecked} onChange={(e) => this.getValue(e)} />Shirts </li> <li> <input type="radio" value="jacket" checked={this.toggleChecked} onChange={(e) => this.getValue(e)} />Jackets </li> <li> <input type="radio" value="skirt" checked={this.toggleChecked} onChange={(e) => this.getValue(e)} />Skirts </li> <li> <input type="radio" value="pants" checked={this.toggleChecked} onChange={(e) => this.getValue(e)} />Pants </li> </ul> <ul> <li> <input type="radio" value="S" checked={this.toggleChecked} onChange={(e) => this.getValue(e)} />S </li> <li> <input type="radio" value="M" checked={this.toggleChecked} onChange={(e) => this.getValue(e)} />M </li> <li> <input type="radio" value="L" checked={this.toggleChecked} onChange={(e) => this.getValue(e)} />L </li> </ul> </div> ); } }
Item.js const Item = (props) => { const renderedList = props.items.map((item) => { return ( <li key={item.id}> <div className="image_container"><img src={item.image} alt={item.name} /></div> <p className="product_name">{item.name}</p> <p className="price">{item.price}</p> <p>Size: {item.size}</p> <p>Category: {item.category}</p> </li> ) }); return <ul className="products">{renderedList}</ul> }
[ { "id": "1", "name": "Black Shirt", "price": "$4.99", "image": "201904041432_1.jpg", "size": "S", "category": "shirt" }, { "id": "2", "name": "Pink Medium Shirt", "price": "$6.99", "image": "201904041432_1.jpg", "size": "M", "category": "shirt" }, { "id": "3", "name": "Red Shirt", "price": "$3.49", "image": "201904190794_1.jpg", "size": "L", "category": "shirt" }, { "id": "4", "name": "Tight Skirt", "price": "$12.99", "image": "401902170012_1.jpg", "size": "S", "category": "skirt" }, { "id": "5", "name": "Short Skirt", "price": "$14.99", "image": "901904190003_1.jpg", "size": "M", "category": "skirt" }, { "id": "6", "name": "Winter Skirt", "price": "$10.99", "image": "401902170126_1.jpg", "size": "L", "category": "skirt" }, { "id": "7", "name": "Black Jacket", "price": "$44.99", "image": "201902181237_1.jpg", "size": "S", "category": "jacket" }, { "id": "8", "name": "Denim Jacket", "price": "$56.99", "image": "042-901811090003_1.jpg", "size": "M", "category": "jacket" }, { "id": "9", "name": "Rider's Jacket", "price": "$84.99", "image": "201902041846_1.jpg", "size": "L", "category": "jacket" }, { "id": "10", "name": "Blue Medium Shirt", "price": "$6.99", "image": "901904240035_1.jpg", "size": "M", "category": "pants" } ]

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/27 06:58
2019/04/27 07:01