提问者:小点点

如何选择html元素的同级节点?


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的确切实例的卡页脚。 我想知道这样做(函数的第一行)是否有任何替代方案。 因为如果我的元素嵌套得很深,那么选择同级节点将是一件痛苦的事。


共1个答案

匿名用户

有两个选择。

  1. 通过本机javascript和react,您可以在调用函数时传递变量,即(editToDo(myIdVar))。 您需要生成唯一的特定ID(在返回之前),将其传递给editToDo,然后使用它按ID(document.getElementById('my uniqueId'))搜索该ID。 这是最好的解决方案,因为它将直接指向特定项,但是,为此,您需要一个唯一的ID.
  2. 您拉入jQuery,它有一个父函数,该函数为特定标记(即$(element)而上升。parent('div.myClass')将查找一个div标记,该标记上有一个myClass类),然后您可以通过选择一个类或告诉一个子项而下降。 您可以通过像$(e.target)或任何其他Javascript DOM对象那样包装e.target来获取元素。 此解决方案不需要唯一的id,它比您的解决方案更具动态性,但执行起来几乎不会多花费多少时间。

相关问题