#javascript #reactjs #react-props
#javascript #reactjs #реагировать-реквизит
Вопрос:
Приведенный ниже код показывает мой текущий дизайн компонента. Это компонент счетчика, который отвечает за увеличение счетчика для соответствующего элемента массива, а также за добавление выбранного элемента в корзину. Я пытаюсь выяснить, есть ли какой-то способ, которым я могу присвоить каждому элементу массива в массиве items его собственное значение количества состояний. В настоящее время на экране отображаются четыре элемента массива, рядом с каждым из которых есть кнопка, а также количество. При нажатии кнопки увеличения для любого конкретного элемента количество состояний для всех кнопок обновляется и отображается, а это не то, что я хочу. Я пытался назначить каждой кнопке собственное количество состояний несколькими способами, но не смог найти правильный способ. Я хотел бы каким-то образом привязать значение количества состояний к каждой кнопке, чтобы у каждой из них было свое индивидуальное количество состояний.Я был бы очень признателен, если бы кто-нибудь мог дать несколько советов или подсказок, поскольку я не знаю способа изолировать количество состояний для каждой кнопки и сделать его уникальным, чтобы при нажатии кнопки одного значения обновлялось только количество состояний для этой конкретной кнопки (расположенной рядом с кнопкой увеличения), ине другие.
class Counter extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0,
cart: [],
};
}
handleIncrement = (e) => {
this.setState({
count: this.state.count 1,
cart: [...this.state.cart, e.target.value],
});
};
render() {
const listItems = this.props.items.map((item) => (
<li key={item.id}>
{item.value}
<button onClick={this.handleIncrement}> </button>
{this.state.count}
</li>
));
return (
<div>
{listItems}
</div>
);
}
}
Ответ №1:
Что я здесь сделал, так это удалил constructor
, обновил Counter
реквизит компонента, обновил событие о том, как обновить корзину в Example
компоненте, скорректировал Counter
компонент для Cart
компонента, который я добавил componentDidMount
, и shouldComponentUpdate
убедился, что компонент будет повторно отображаться только при listArray
изменении реквизита. Вот код.
class Example extends React.Component {
state = {
cart: [],
items: [
{ id: 1, value: "L1" },
{ id: 2, value: "L2" },
{ id: 3, value: "L3" },
{ id: 4, value: "L4" }
]
}
render() {
const { cart } = this.state
return (
<div>
<h1>List</h1>
{ items.map(
({ id, ...rest }) => (
<Counter
key={ id }
{ ...rest }
cart={ cart }
onAddToCard={ this.handleAddCart }
/>
)
) }
</div>
)
}
handleAddCart = (item) => {
this.setState(({ items }) => ([ ...items, item ]))
}
}
class Counter extends React.Component {
state = {
count: 0
}
handleIncrement = () => {
this.setState(({ count }) => ({ count: count }))
}
render() {
const { count } = this.state
const { cart, value } = this.props
return (
<div>
{ value }
<span>
<button onClick={ this.handleIncrement }> </button>
{ count }
</span>
<Cart listArray={ cart } />
</div>
)
}
}
class Cart extends React.Component {
state = {
cart: []
}
addTo = () => (
<div>List: </div>
)
componentDidMount() {
const { cart } = this.props
this.setState({ cart })
}
shouldComponentUpdate({ listArray }) {
return listArray.length !== this.state.cart.length
}
render() {
return (
<div>
<ListFunctions addClick={ this.addTo } />
</div>
)
}
}
const ListFunctions = ({ addClick }) => (
<div>
<button onClick={ addClick }>Add To List</button>
</div>
)
Ответ №2:
Если вы хотите добавить в список элементов без отображения кнопки, вы можете добавить пользовательское свойство, чтобы отметить, что это пользовательское добавление:
class Example extends React.Component {
constructor(props) {
super(props);
this.state = {
items: [
{ id: 1, value: "L1" },
{ id: 2, value: "L2" },
{ id: 3, value: "L3" },
{ id: 4, value: "L4" },
]
}
}
addToItems = items => {
this.setState({
items,
});
}
render() {
var cartArray = [];
return (
<div>
<h1>List</h1>
{this.state.items.map((item) =>
<Counter
key={item.id}
value={item.value}
id={item.id}
custom={item.custom}
cart={cartArray}
addToItems={this.addToItems}
items={this.state.items}
/>
)}
</div>
);
}
}
class Counter extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0,
};
}
handleIncrement = () => {
this.setState({
count: this.state.count 1,
});
this.props.cart.push(this.props.value);
};
addTo = () => {
const { items } = this.props;
let lastId = items.length;
lastId ;
this.props.addToItems([
...items,
{
id: lastId,
value: `L${lastId}`,
custom: true,
}]);
};
render() {
return (
<div>
{this.props.value}
{
!this.props.custom amp;amp;
(
<span>
<button onClick={this.handleIncrement}> </button>
{this.state.count}
</span>
)
}
<Cart addTo={this.addTo} />
</div>
);
}
}
class Cart extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<div>
<ListFunctions
addClick={this.props.addTo}
/>
</div>
);
return null;
}
}
const ListFunctions = ({ addClick}) => (
<div>
<button onClick={addClick}>Add To List</button>
</div>
);
// Render it
ReactDOM.render(
<Example />,
document.getElementById("react")
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="react"></div>