Hacktoberfest 2026: as issues que os mantenedores marcaram para outubro, abertas e boas para iniciantes. Ver issues do Hacktoberfest

[Suggestion]: Improvements to an example in the document

Aberta Para iniciantes
#8,141 2 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
2/5
Tempo estimado
1-3 horas
Facilidade para iniciantes
72/100
Tipo de issue
Documentação
Clareza
Claramente especificada
Status de atividade
Pouca atividade
Stack de tecnologia
javascript, react, typescript
Domínio
documentation

Direção de pesquisa

Comece pelo exemplo na página sobre escolha da estrutura de estado e compare seu comportamento atual de exclusão com o código fornecido de HookDemo e PlaceTree. Atualize o exemplo da documentação para que excluir o único filho também remova os ancestrais que agora estejam vazios e, em seguida, verifique a árvore renderizada e o comportamento de exclusão no exemplo.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

type: documentation
Summary

I learned a lot from this example. After understanding it more deeply, I discovered that if a child item is the only child of its parent item, the parent item should also be deleted after deleting it. The original documentation didn't consider this, and there were many details to pay attention to during implementation. I finally completed it, and I'll post my code below.

Page

https://react.dev/learn/choosing-the-state-structure

Details

import {useImmer} from 'use-immer'
import {initialTravelPlan} from './travel.ts'

interface PlaceTreeProps {
id: number
parentId: number
plan: TravelPlan
onComplete: (parentId: number, id: number) => void
}

interface TravelPlan {
[key: number]: {
id: number
title: string
childIds: number[]
}
}

export default function HookDemo() {
const [plan, setPlan] = useImmer(initialTravelPlan)
const root = plan[0]
const planetIds = root.childIds
const handleComplete = (parentId: number, id: number) => {
setPlan(draft => {
if (id===0) return
handleChildrenDelete(id)
handleParentDelete(parentId,id)

        function handleParentDelete(pId: number,cId: number) {
            const parent = draft[pId]
            if (!parent) return
            parent.childIds = parent.childIds.filter((childId) => childId !== cId)
            **// if the parent has no more children, delete it too**
            if (parent.childIds.length === 0 && pId !== 0) {
                const grandParentId = Object.values(draft).find(p => p.childIds.includes(pId))?.id
                if (grandParentId !== undefined) {
                    handleParentDelete(grandParentId, pId)
                }
                delete draft[pId]
            }
        }

        function handleChildrenDelete(childId: number) {
            const child = draft[childId]
            if (!child) return
            child.childIds.forEach((grandChildId) => {
                handleChildrenDelete(grandChildId)
            })
            delete draft[childId]
        }
    })
    console.log(parentId, id)
}
return (
    <div>
        <h2>Place to Visit</h2>
        <ol>
            {planetIds.map((id) => (
                <PlaceTree
                    id={id}
                    key={id}
                    parentId={0}
                    plan={plan}
                    onComplete={handleComplete}
                />
            ))}
        </ol>
    </div>
)

}

function PlaceTree({id, parentId, plan, onComplete}: PlaceTreeProps) {
const place = plan[id]
const childIds = place.childIds
return (


  • {place.title}
    <button type={'button'} onClick={() => onComplete(parentId, id)}>
    Del

    {
    childIds.length > 0 &&

      {
      childIds.map(childId => )
      }

    }

  • )
    }

    Linguagem predominante
    JavaScript
    Estrelas
    11.8k
    Forks
    7.9k
    Merge médio
    16h 6min
    PRs com merge (30d)
    7

    Guia de contribuição

    Abrir o guia de contribuição

    Primeiros passos

    1. Leia a issue inteira e depois o guia de contribuição do projeto.
    2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
    3. Faça um fork do repositório e trabalhe em uma branch.
    4. Abra um pull request que referencie o número da issue.

    Mais de reactjs/react.dev

    Todas as issues de reactjs/react.dev

    Issues semelhantes

    Mais issues de JavaScript

    Receba novas issues na sua caixa de entrada

    Um resumo curto de issues do GitHub para quem está começando.