Работа с 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, время: 15:02. |