#javascript #reactjs
#javascript #reactjs
Вопрос:
** У меня возникла проблема, когда каждый раз, когда я пытаюсь удалить самый верхний флажок, значение в текстовой области не удаляется. Вместо этого значение в текстовой области передается нижнему компоненту. Почему это происходит и как я могу это решить? Например, я прикрепил imgur к проблеме, с которой я имею дело. Если вы присмотритесь, к каждому флажку прикреплен уникальный идентификатор. Например, когда я пытаюсь удалить «Hello», оно не удаляется, а вместо этого передается нижнему компоненту. Я пытался выяснить это, но безуспешно. Пожалуйста, помогите мне. **
**PriorityLists.jsx**
import React, {useState, useEffect} from "react";
import { Priority } from "./Actions";
function PriorityLists(props) {
const [isChecked, setChecked] = useState(false);
const [changeInput, setChangeInput] = useState(null);
function check(e) {
const id_to_be_deleted = e.target.attributes.getNamedItem("unique_Key").value;
if(!isChecked) {
setChecked(true);
props.addIds(isChecked, id_to_be_deleted);
}
else {
setChecked(false);
props.addIds(isChecked, id_to_be_deleted)
}
}
return (
<form key = {props.id} >
<div className = "input-group mb-3">
<div className="input-group-prepend">
<div className="input-group-text">
<input unique_Key = {props.id} onInput = {e=> e.target.checked = isChecked} onClick={e=> check(e) } checked = {props.checked} id = "check-item" type="checkbox" aria-label="Checkbox for following text input"/>
</div>
</div>
<textarea id = {props.id} onChange = {e=>setChangeInput(e.target.value)} value = {changeInput} class="form-control" rows="1" name = {props.name}></textarea>
<Priority/>
</div>
</form>
)
}
export {PriorityLists};
**Tasks.jsx**
import React, {useState, useEffect} from "react";
import {Delete, Refresh, Add} from "../components/Actions";
import {Header} from "../components/Header";
import {PriorityLists} from "../components/PriorityLists";
import {v4 as uuidv4} from 'uuid';
function Task() {
const [toDo, setToDo] = useState([]);
const [idsToRefresh, setIdsToRefresh] = useState([]);
const [filter_items, setFilterItems] = useState(false);
const [ids, setIds] = useState([]);
useEffect(() => {
if(toDo[0] !== undefined) {
setToDo(toDo.filter(item=> {
return !ids.includes(item._Id);
}))
}
}, [filter_items]);
function addIds(checked, id_to_be_deleted) {
if(!checked) {
setIds((item)=> [...item, id_to_be_deleted]);
}
else {
setIds(ids.filter(item=> {
return item !== id_to_be_deleted;
}))
}
}
function addToDos() {
const id = uuidv4();
setToDo(toDo.concat({_Id: id, value:<PriorityLists id = {id} checked = {false} addIds = {addIds} />}));
setIdsToRefresh(idsToRefresh.concat(id));
}
function refresh() {
setToDo(toDo.filter(item=> {
return !idsToRefresh.includes(item._Id);
}))
}
return (
<div className = "main-content">
<div className = "container-fluid">
<div className = "row underline">
<div className= "col">
<div className = "row">
<div className = "col-3 pt-2">
<Refresh _refresh = {refresh} />
</div>
<div className = "col-6 text-center">
<Header header ={"Tasks"}/>
</div>
<div className = "col-3 pt-2">
<button className = "float-right">
<Delete setFilterItems = {setFilterItems} filter = {filter_items} />
</button>
</div>
</div>
</div>
</div>
<div className = "row">
<div className = "col">
{
toDo.map(item=> {
return (<div>
<ul>
<li>{item.value} {item._Id}</li>
</ul>
</div>)
})}
</div>
</div>
<div className = "row">
<div className = "col pr-4">
<Add addToDos = {addToDos} />
</div>
</div>
</div>
</div>
)
}
export default Task;
Ответ №1:
Это происходит, когда вы не указываете правильные ключи при рендеринге массива элементов. Дайте им уникальный ключ. например:
toDo.map(item=> {
return (<div key={item._Id}>
Затем при удалении чего-либо удалите его с помощью этого ключа, а не на основе его позиции в списке.
Также посмотрите, что такое ключи и почему они важны в React, особенно в отношении изменяемых списков
Комментарии:
1. БОЛЬШОЕ ВАМ СПАСИБО! Я знал, что это что-то связанное с ключом, но не знал, где это происходит. Я потратил неделю, пытаясь разобраться в этом.
2. @Ron не беспокойтесь, рад, что все отсортировано 🙂 если этот ответ решает ваш вопрос, пожалуйста, отметьте его как правильный ответ (галочка под стрелкой вниз)
3. Чувак, большое тебе спасибо, буквально целый день потрачен впустую для меня, я пропустил эту ключевую часть, спасибо