Je fais ReactDOM.render #container element(top-level) dans la fonction componentDidMount, React me montre une erreur, Impossible de lire la propriété 'rootID' de null .
Si j'utilise setTimeout, exécutez ReactDOM.render, ça marche. (Même après 0 ms)
Je me sens incertain, quelqu'un pourrait-il m'aider?
html :
<!DOCTYPE html>
<html>
<head>
<title>React</title>
</head>
<body>
<div id="container"></div>
<script type="text/javascript" src="script/lib/react.js"></script>
<script type="text/javascript" src="script/lib/react-dom.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.23/browser.min.js"></script>
<script type="text/javascript" src="script/bundle.js"></script>
</body>
</html>
A.jsx & B.jsx :
var A = React.createClass({
componentDidMount: function(){
ReactDOM.render(
<B />,
document.getElementById('container')
);
},
render: function(){
return (
<div>Hello World, I'm A.</div>
)
}
});
var B = React.createClass({
render: function(){
return (
<div>Hello World, I'm B.</div>
)
}
});
app.jsx :
ReactDOM.render(
<A />,
document.getElementById('container')
);
Pouvez-vous reproduire votre problème dans un jsfiddle ? https://jsfiddle.net/L3zn8dws/
La vraie question est pourquoi appelez-vous ReactDOM.render
depuis une méthode de cycle de vie ? Vous essayez de monter un nouveau composant sur le nœud sur lequel le composant actuel est monté, ce qui ressemble à un anti-modèle.
Vous devez utiliser un composant parent racine pour gérer le rendu du composant, au lieu d'essayer de le remonter à la racine. Si vous devez absolument avoir plusieurs racines React (pour lesquelles vous devriez avoir une très bonne raison), vous devriez utiliser une sorte de système d'assistance pour gérer ceci :
https://facebook.github.io/react/blog/2015/10/01/react-render-and-top-level-api.html#helpers
Si vous avez plusieurs racines React ou une seule racine qui est supprimée au fil du temps, nous vous recommandons de toujours créer votre propre API wrapper. Ceux-ci auront tous un aspect légèrement différent en fonction de l'apparence de votre système externe. Par exemple, chez Facebook, nous avons un système qui se connecte automatiquement à notre routeur de transition de page pour appeler automatiquement unmountComponentAtNode.
Plutôt que d'appeler ReactDOM.render() directement partout, pensez à écrire/utiliser une bibliothèque qui gérera le montage et le démontage au sein de votre application.
Cela semble être un modèle non pris en charge : vous essayez de restituer quelque chose dans un conteneur qui contient déjà un autre composant dont les cycles de vie sont en cours d'exécution.
Si vous voulez que B
apparaisse, incluez <B />
partir de la sortie de rendu de A
.
Commentaire le plus utile
La vraie question est pourquoi appelez-vous
ReactDOM.render
depuis une méthode de cycle de vie ? Vous essayez de monter un nouveau composant sur le nœud sur lequel le composant actuel est monté, ce qui ressemble à un anti-modèle.Vous devez utiliser un composant parent racine pour gérer le rendu du composant, au lieu d'essayer de le remonter à la racine. Si vous devez absolument avoir plusieurs racines React (pour lesquelles vous devriez avoir une très bonne raison), vous devriez utiliser une sorte de système d'assistance pour gérer ceci :
https://facebook.github.io/react/blog/2015/10/01/react-render-and-top-level-api.html#helpers
Plutôt que d'appeler ReactDOM.render() directement partout, pensez à écrire/utiliser une bibliothèque qui gérera le montage et le démontage au sein de votre application.