import React, {useEffect, useContext, useState} from 'react';
import {FormContext} from "../../../core/context";
export default function Todo(props) {
const { todos, setTodos, deleteTodo, onEditSubmit, editContent, setEditContent} = useContext(FormContext);
const [isEditing, setIsEditing] = useState(false);
useEffect(() => {
}, [isEditing])
return (
<div className={todoCard(props.todo)} id="todo-card">
<div className="card-body d-flex align-items-center">
<input type="checkbox" className="mx-2"
onChange={() => props.toggleCompleted(props.index)}
checked={props.todo.isCompleted}/><span className={props.todo.isCompleted ? 'line-through mr-auto': 'mr-auto'}>{props.todo.content}</span>
<i className={editIcon()} id="edit" onClick={(e) => editTodo(e)}></i>
<i onClick={() => deleteTodo(props.todo.id)} className="fa fa-trash-o fa-lg" id="trash-o"></i>
</div>
<div style={{display: 'none'}} className='card-footer m-0 p-0 justify-content-center'>
<form className="p-2 d-flex" onSubmit={(e) => onEditSubmit(e, props.todo.id)}>
<input type="text" className="form-control mx-2" onChange={(e) => setEditContent(e.target.value)} />
<input type="submit" value="Submit" className="btn btn-warning"/>
</form>
</div>
</div>
);
function editIcon() {
let baseline = 'fa fa-pencil-square-o mx-3';
if (isEditing) baseline += 'editing';
return baseline;
}
function editTodo(e) {
const cardFooter = e.target.parentElement.parentElement.childNodes[1];
cardFooter.style.display === 'none' ? cardFooter.style.display = 'flex': cardFooter.style.display = 'none';
}
function todoCard(item) {
let className = 'card';
if (item.isFound) className += 'text-white bg-info';
return className;
}
}
在editTodo()函数的第一行,我选择了我试图编辑的todo的确切实例的卡页脚。 我想知道这样做(函数的第一行)是否有任何替代方案。 因为如果我的元素嵌套得很深,那么选择同级节点将是一件痛苦的事。
有两个选择。
editToDo(myIdVar)
)。 您需要生成唯一的特定ID(在返回之前),将其传递给editToDo
,然后使用它按ID(document.getElementById('my uniqueId')
)搜索该ID。 这是最好的解决方案,因为它将直接指向特定项,但是,为此,您需要一个唯一的ID.$(element)而上升。parent('div.myClass')
将查找一个div
标记,该标记上有一个myClass
类),然后您可以通过选择一个类或告诉一个子项而下降。 您可以通过像$(e.target)
或任何其他Javascript DOM对象那样包装e.target
来获取元素
。 此解决方案不需要唯一的id,它比您的解决方案更具动态性,但执行起来几乎不会多花费多少时间。