Работа с DOM useRef и философия реакта
Здравствуйте!!!
Кто может подсказать как обойти секцию в компоненте Node с useEffect, useRef(говорят эта связка противоречит философии реакта), но как тогда мне определить рутовый компонент в дереве и ноды которые являются последними? Как получать доступ к li без ref? export const ShowTree = () => { const [tree, setTree] = useState([]) console.log('rerender tree', tree) useEffect(() => { async function loadTree(){ const response = await getTree() setTree(JSON.parse(response)) } loadTree() }, []) return <Tree data={tree} /> } const Node = ({node}) => { const hasChildrens = node.childrens ? true : false const classesNode = ['node','expandOpen'] const nodeTag = React.useRef(null); const handleExpand = (e) => { e.stopPropagation() const target = e.target console.log('click', target) } useEffect(() => { const isRoot = nodeTag?.current?.parentNode?.parentNode.tagName !== 'LI' ? nodeTag.current.classList.add('isRoot') : null const isLast = nodeTag.current.nextSibling ? null : nodeTag.current.classList.add('isLast') console.log('next', nodeTag.current.nextSibling) }, []) return( <> <li ref={nodeTag} className={classesNode.join(' ')} > <div className="expand-container"> <div className="expand" onClick={handleExpand}></div> <div className="content">{node.name}</div> </div> { hasChildrens && ( <Tree data={node.childrens} /> ) } </li> </> ) } const Tree = ({data}) => { return( <> <ul className="tree-container"> { data?.map(el => { return( <Node node={el} /> ) }) } </ul> </> ) } |
jabbascript, я как раз читаю про хуки и готов поучаствовать в твоей проблеме в качестве закрепления прочитанного материала. :)
Но пример, который ты выложил, не особо рабочий... :( Предлагаю сделать некий рабочий пример и на нем все это опробовать. Что в итоге ты хочешь сделать с этим списком? Для чего хочешь применять useEffect()? Т.е. я не до конца понял суть твоей проблемы и твои желания в этом примере... :( |
Вот, вполне себе, рабочий тестовый пример... На нем и можно будет потренироваться.
Чего ты в итоге хотел? import React,{useState, useEffect} from 'react'; import ReactDOM from 'react-dom'; import './index.css'; const Node = ({node}) => { const childrens = node.childrens ? <Tree data={node.childrens} /> : '' const classesNode = ['node', 'expandOpen'] const handleExpand = (e) => { e.stopPropagation() const target = e.target console.log('click', target) } return ( <li className={classesNode.join(' ')}> <div className="content" onClick={handleExpand}>{node.name}</div> {childrens} </li> ) } const Tree = ({data}) => { return ( <ul className="tree-container"> { data.map(el => { return ( <Node key={el.id} node={el} /> ) }) } </ul> ) } const ShowTree = () => { const [tree, setTree] = useState([]) console.log('rerender tree', tree) useEffect(() => { setTimeout(() => setTree([ {name: 'Item 0', id: 0}, { name: 'Item 1', id: 1, childrens: [ {name: 'Item 1 0', id: '1, 0'}, {name: 'Item 1 1', id: '1, 1'}, {name: 'Item 1 2', id: '1, 2'}, ] }, {name: 'Item 2', id: 2}, ]), 1000) }, []) return <Tree data={tree} /> } ReactDOM.render( <ShowTree />, document.getElementById('root') ); |
видно, что товарищ пришел из jquery ) или из document.getElementById()...
Здесь надо понять ) что надо менять в памяти объект, чтобы что-то поменялось, а не делать изменения через DOM... |
Цитата:
Реши поучаствовать, дабы поднять свой скилл. :D |
Часовой пояс GMT +3, время: 09:30. |