#javascript #arrays #reactjs #jsx
Вопрос:
я прошу прощения за самый простой вопрос, так как я новичок в реагировании на js. я создал массив в компоненте react и визуализирую его с помощью функции map в одном компоненте, и я хочу изменить (добавить/тему) в массиве из другого компонента на основе _id. ниже приведен пример, который поможет вам лучше понять, чего я на самом деле хочу. Заранее благодарю, сэр
{*Array Component*}
const ArrayData =[
{
_id:1,
title:"All Searches"
},
{
_id:5,
title:1
},
{
_id:6,
title:"4"
}
]
export default ArrayData;
{*2nd Component*}
import react from "react"
import ArrayData from ArrayComponent
class Parent extends React.Component {
constructor() {
super();
this.state = {
ArrayData:ArrayData,
collapsed: false,
}
}
render() {
const { ArrayData } = this.state;
return (
<>
<FirstChild Data={ArrayData} />
<SecondChild />
</>
);
}
}
export default Parent;
!------------------------------------------!
{*FirstChild*}
class FirstChild extends React.Component {
constructor(props){
super();
this.state={
ArrayData:props.ArrayData
}
}
render() {
const { ArrayData} = this.state;
const renderArray = ArrayData.slice(0, 5).map(Object => {
return <h1>{object._id} </h1>
})
return (
<>
{renderArray}
</>
);
}
}
export default FirstChild;
!-----------------------------------------!
{*SecondChild*}
import { React } from "react";
const SecondChild = () => {
const handleUpdate=(_id, Title) =>{
{*function that can add the inputs as a object into that arrayComponent*}
}
const handleDelete=(_id) =>{
{*function that can delete a object from that arrayComponent having the id given by User in the feild*}
}
return (
<>
<input type='text' name='_id' placeHolder="Which object you want to delete" />
<button type=Submit onClick={handleDelete} >Delete</button>
<br></br>
<input type='text' name='_id' />
<input type='text' name='title' />
<button type=Submit onClick={handleUpdate} >Update</button>
</>
);
}
export default SecondChild;
Комментарии:
1. что
change
означает, хотите ли вы выполнить операцию CRUD сArrayData
массивом.2. Что именно является предметом? Являются ли они объектами внутри
ArrayData
?3. Вы не передали
tabsData
изParent
компонента. Так как же вы могли попасть вchild
компонент? Пожалуйста, уточните, что вы хотите сделать и что вы пробовали.4. извините, что это было по ошибке
5. Мне нужно добавить новый элемент в свой массив, когда это необходимо, и удалить элемент, содержащий определенный идентификатор, из того же массива, например, если пользователь добавляет данные, он должен добавить эти данные в этот массив в качестве еще одного объекта (3 до и теперь 4 объекта в этом массиве), и пользователь хочет удалить элемент, имеющий определенный идентификатор, затем он удаляет этот объект из массива, у которого есть этот идентификатор
Ответ №1:
Все, что вам нужно сделать, это объявить handleDelete
и handleUpdate
в Parent
компоненте и передать его как props
SecondChild
компонент in. Если мы поместим состояние и его методы в Parent
компонент, то его будет легко отслеживать, отлаживать и поддерживать. Было бы легко передать методы, если бы мы определили другой компонент, скажем ThirdComponent
, и он также содержит функциональность для выполнения операции CRUD с ArrayData
массивом.
В FirstChild
компоненте вы разрушали данные const { ArrayData} = this.state;
массива и использовали их в методе визуализации. Он не будет обновляться, мы получаем новое props
, потому что вы отображаете состояние массива, которое создается один раз(так как конструктор будет вызван один раз), и нам нужно последнее значение ArrayData
из родительского компонента. Мы можем использовать реквизит непосредственно в render
методе. Вам нужно просмотреть методы жизненного цикла react.
Parent.js
import React from "react";
import ArrayData from "./ArrayComponent";
import FirstChild from "./FirstChild";
import SecondChild from "./SecondChild";
class Parent extends React.Component {
constructor() {
super();
this.state = {
ArrayData: ArrayData,
collapsed: false
};
this.handleDelete = this.handleDelete.bind(this);
this.handleUpdate = this.handleUpdate.bind(this);
}
handleDelete(id) {
const idToDelete = parseInt(id, 10);
this.setState((state) => {
const filteredArrayData = state.ArrayData.filter(
(el) => el._id !== idToDelete
);
return {
ArrayData: filteredArrayData
};
});
}
handleUpdate(newObj) {
console.log(newObj);
this.setState((state) => ({
ArrayData: [...state.ArrayData, newObj]
}));
}
render() {
return (
<>
<FirstChild Data={this.state.ArrayData} />
<SecondChild
handleUpdate={this.handleUpdate}
handleDelete={this.handleDelete}
/>
</>
);
}
}
export default Parent;
FirstChild.js
import React from "react";
class FirstChild extends React.Component {
render() {
return (
<>
{this.props.Data.slice(0, 5).map((el) => {
return <h1 key={el._id}>{el._id}</h1>;
})}
</>
);
}
}
export default FirstChild;
SecondChild.js
import React, { useState } from "react";
const SecondChild = ({ handleUpdate, handleDelete }) => {
const [idToDelete, setIdToDelete] = useState(null);
const [newID, setNewID] = useState(null);
const [newTitle, setNewTitle] = useState("");
return (
<>
<input
name="_id"
type="number"
onChange={(e) => setIdToDelete(e.target.value)}
placeholder="Which object you want to delete"
/>
<button type="submit" onClick={() => handleDelete(idToDelete)}>
Delete
</button>
<br></br>
<br></br>
<br></br>
<input
type="text"
name="_id"
placeholder="id"
onChange={(e) => setNewID(e.target.value)}
/>
<input
type="text"
name="title"
placeholder="title"
onChange={(e) => setNewTitle(e.target.value)}
/>
<button
type="submit"
onClick={() => handleUpdate({ _id: newID, title: newTitle })}
>
Update
</button>
</>
);
};
export default SecondChild;