Изменить значение в state массива
![]() По нажанию на лайк, должен измениться цвет и увеличится кол-во на +1. Повторное нажание -1. Компанент для вывода итемов import React, { Component } from 'react'; export default class Items extends Component { handleClick = () => { }; render() { return( <div className="items"> {this.props.mass.map((i, index) => { return ( <div className="item" key={index}> <div className="item__img"> <img src={i.img} alt="rose" /> </div> <div className="item__text"> <p className="item__title">{i.title}</p> <p className="item__hashtag">{i.hashtag}</p> <i className="fa fa-eye"></i><span className="item__viev">{i.viev}</span> <i className="fa fa-heart" onClick={this.handleClick({index})}></i><span className="item__like">{i.like}</span> </div> </div> ) })} </div> ); } } Еще компонент, из которого я передаю значения import React, { Component } from 'react'; import Background from '../img/cyprus-3184019_1920.jpg'; import Items from './Items'; import RoseImg from '../img/rose.jpg'; import LeafImg from '../img/leaf.jpg'; export default class Main extends Component { constructor(props){ super(); this.state = { mass : [{ id: 1, img: RoseImg, title: '1Beautiful mint and glass bowl', hashtag: '#beauty #glass #mint #green #white #health', viev: 1130, like: 30, click: false }, { id: 2, img: LeafImg, title: '2Beautiful mint and glass bowl', hashtag: '#beauty #glass #mint #green #white #health', viev: 1130, like: 20, click: false }, { id: 3, img: RoseImg, title: '3Beautiful mint and glass bowl', hashtag: '#beauty #glass #mint #green #white #health', viev: 1130, like: 35, click: false }] } } render() { var sectionStyle = { width: "100%", height: "100%", backgroundImage: `url(${Background})` }; return ( <div className="main" style={ sectionStyle }> <div className="container"> <h1>World’s most <span className="main__span">amazing</span> test tiles</h1> <Items mass={this.state.mass}/> </div> </div> ); } } Как я думаю. По клику onClick={this.handleClick} вызывается функция, в которой ({{index}}) передается текущий итем. 1)берется текущий стейт 2) вытягиваем лайк 3) увеличиваем на 1 4) обновляем handleClick = (i) => { const newMass = this.state.mass[i]; newMass.like = this.state.mass[i].like +1 ; this.setState({ mass: newMass }) }; Помогите разобраться |
Пожалуйста, отформатируйте свой код!
Для этого его можно заключить в специальные теги: js/css/html и т.п., например: [js] ... ваш код... [/js] О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting. |
Цитата:
Цитата:
Попробуйте так: handleClick = index => { const list = this.state.mass; const item = list[index]; item.like += item.click ? -1 : 1; item.click = !item.click; list[index] = item; this.setState({ mass: list }); } |
Nexus, в таком варианте handleClick изменения будут в самом this.state.mass, но поскольку вся фича реакта, не изменять текущий стейт напрямую, и, соответственно, это неправильно. Надо сначала сделать клон объекта, и в нем уже менять... а то не будут time travel )))
|
SuperZen, вам виднее, я с реактом на Вы)
Правильно ли будет перенести данные из state в props? |
Подскажите тогда
при нажатии onClick={this.handleClick} вызываю лог export default class Items extends Component { handleClick = index => { console.log('Click'); } Все отрабатывает. Как по нажатию в лог вывести текущий like? делаю так и вылетает ошибка handleClick = index => { const list = this.props.mass; //клон mass array const item = list[index]; // mass[item] кликнутый итем item.like = 1; //меняем текушее значение на 1 list[index] = item; //обновляем клон this.setState({ mass: list //обновляем state }); console.log('Clock'); } Ошибка TypeError: Cannot set property 'like' of undefined |
dmitry.suhotsky, попробуйте классу Items добавить такой конструктор:
constructor(props){ super(props); this.handleClick=this.handleClick.bind(this); } |
Nexus, из props в state если только для формы, которая требует валидации... лучше конечно разобраться с context, чтобы горадули не годарить )
dmitry.suhotsky, в первом посте onClick={this.handleClick({index})} заменить на onClick={() => this.handleClick({i, index})} только тогда, при каждом ререндерере будет пересоздаваться ф-ция, при больших объемах (сотни-тыщи) это будут влиять на производительность, а если штук 10-50, то можно забить... или если прям хочется идеалов, тогда надо осознать это https://reactjs.org/docs/optimizing-performance.html |
SuperZen,
Цитата:
|
Nexus, ну тогда через пропсы должна быть передана ф-ция из родительского компонента, которая будет вызвана с дочерним стейт... в общем надо смотреть context, или redux, или mobx, или ) apolloGraphQL...
|
Часовой пояс GMT +3, время: 23:09. |