reactjs / reactjs/react.dev

[Suggestion]: Add note with some CSS selector side effects depending on DOM presence to `Activity` troubleshooting

Abierto
#8,354 1 comentario 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

type: documentation
Lenguaje dominante
JavaScript
Estrellas
11.8k
Forks
7.9k
Merge medio
1 d 11 h
PR fusionados (30 d)
11

Descripción

Summary

Docs in Activity troubleshooting section,

My hidden components have unwanted side effects, lists <video>, <audio>, and <iframe> as common examples of side effects, but it does not yet cover the category of CSS selectors.

Some common CSS selectors, such as :has() and :is(), may continue to match after the content is hidden by <Activity>, leading to unexpected residual styles.

Page

https://react.dev/reference/react/Activity#troubleshooting

Details

Description

<Activity mode="hidden"> is designed to preserve DOM nodes (applying display: none), which is an intentional design choice. However, most CSS selectors only check the DOM structure and do not consider whether the element is actually visible.

This aligns with the existing explanation in the documentation:

"since a hidden component's DOM is not destroyed, any side effects from that DOM will persist, even after the component is hidden."

The persistent matching of CSS selectors is the exact same kind of DOM side effect, just occurring at the CSS layer,

But, docs doesn't have specific guidance for this type of CSS side effect on DOM. I have some problem to ask for suggestions:

  • Does the useLayoutEffect cleanup pattern mentioned in the docs for <video> also apply to handling this kind of CSS side effect?
  • Or is this a known limitation of the <Activity> design that should be explicitly stated in the documentation so developers are aware of it in advance?

Affected Selectors

:has()

/* ⚠️ Still applies after PageA is hidden by Activity */
body:has([data-has="a"]) .banner { background: red; }

:is() / :where()

/* ⚠️ Hidden elements are still matched, causing adjacent sibling styles to persist */
:is(section[data-sibling="a"]) ~ .footer { color: red; }
:where([data-page="a"]) .title { font-weight: bold; }

Demo

https://github.com/fufuShih/demo-react-activtiy-problem

The demo have two toggle modes (unmount / activity) and two page comps (A / B):

  • HasDemo: Uses body:has([data-has="a"]) .banner to detect if Page A is visible. After switching to Page B, the banner should revert to its default color.
  • SiblingDemo: Uses :is(section[data-sibling="a"]) ~ .footer to detect adjacent sibling elements. After switching to Page B, the footer should revert to its default color.

Both behave normally in unmount mode. However, when switched to activity mode, Page A is hidden by <Activity mode="hidden"> but remains in the DOM, causing both selectors to continue matching and preventing the styles from resetting.

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza por la sección de solución de problemas de Activity y el repositorio de demostración enlazado, revisando la explicación existente de los efectos secundarios persistentes del DOM junto con los ejemplos de :has(), :is() y :where(). Confirma las indicaciones esperadas para la coincidencia de selectores CSS y, después, actualiza la documentación de solución de problemas con una nota precisa y ejemplos que expliquen el comportamiento.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
css, react
Área
documentation
Tipo de issue
Documentación
Dificultad
3/5
Tiempo estimado
1-2 días
Estado de actividad
Tranquilo
Claridad
Bastante claro
Aptitud para principiantes
52/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.