Extension de réaction
définir l'état
-
setState(stateChange,[callback]) ------ setState basé sur des objets
-
stateChange est l'objet de changement d'état (cet objet peut refléter le changement d'état)
-
le rappel est une fonction de rappel facultative, qui est appelée après la mise à jour du statut et la mise à jour de l'interface (appels de rendu)
-
setState(updater,[callback]) ------ SetState fonctionnel
-
updater est une fonction qui renvoie un objet stateChange
-
le programme de mise à jour peut recevoir l'état et les accessoires
-
le rappel est une fonction de rappel facultative, qui est appelée après la mise à jour du statut et la mise à jour de l'interface (appel de rendu)
Résumer:
- setState de style objet est l'abréviation de setState fonctionnel (sucre syntaxique)
- Principes d'utilisation :
- Si le nouvel état ne dépend pas de l'état d'origine ==> utiliser le style objet
- Si le nouvel état dépend de l'état d'origine ==> utiliser l'expression fonctionnelle
- Si vous avez besoin d'obtenir les dernières données d'état après l'exécution de setState(), lisez-les dans la deuxième fonction de rappel.
paresseuxLoad
lazyLoad des composants de routage
// 1.通过React的lazy函数配合inport()函数动态加载路由组件 ===> 路由组件代码会被分开打包
const Login = lazy(() => import('@/pages/Login'))
// 2.通过<Suspense>指定在加载得到路由打包文件前显示一个自定义loading界面
<Suspense fallback={
<h1>loading......</h1>}
<Switch>
<Route path="/xxx" component={
Xxx} />
<Redirect to="/login" />
</Switch>
</Suspense>
Crochets
Que sont les crochets/crochets React
- Hook est une nouvelle fonctionnalité/nouvelle syntaxe ajoutée dans la version React 16.8.0
- Vous permet d'utiliser l'état et d'autres fonctionnalités de React dans les fonctions
Trois crochets couramment utilisés
- Crochet d'état:React.useState()
- Crochet d'effet:React.useEffect()
- Crochet de référence:React.userRef()
Crochet d'État
- State Hook permet aux composants de fonction d'être dans un état et de lire et d'écrire des données d'état.
- Syntaxe : const [xxx,setXxx] = React.userState(initValue)
- Description de useState() :
- Paramètres : la valeur spécifiée lors de la première initialisation est mise en cache en interne.
- Valeur de retour : un tableau contenant 2 éléments, le premier est la valeur d'état actuel interne et le second est la fonction de mise à jour de la valeur d'état
- Il existe 2 façons d'écrire setXxx() :
- setXxx(newValue) : le paramètre est une valeur non fonctionnelle, spécifie directement la nouvelle valeur d'état et l'utilise en interne pour écraser la valeur d'état d'origine.
- setXxx(value => newValue) : le paramètre est une fonction, reçoit la valeur d'état d'origine, renvoie la nouvelle valeur d'état et l'utilise en interne pour écraser la valeur d'état d'origine.
Crochet d'effet
-
Effect Hook vous permet d'effectuer des opérations d'effets secondaires dans les composants de fonction (utilisés pour simuler des hooks de cycle de vie dans les composants de classe)
-
Opérations sur les effets secondaires dans React China :
-
Envoyer une requête ajax pour obtenir des données
-
Définir l'abonnement/la minuterie de démarrage
-
Changer manuellement le vrai DOM
-
Syntaxe et instructions :
useEffect(() => {
// 在此可以执行任何带副作用的操作
return () => {
// 在此做一些收尾工作,比如清除定时器/取消订阅等
}
},[stateValue]) // 如果指定的是[],回调函数只会在第一次render()后执行
- Vous pouvez considérer useEffect Hook comme une combinaison des trois fonctions suivantes
composantDidMount()
composantDidUpdate()
composantWillUnmount()
Réf Crochet
- Ref Hook peut stocker/trouver des étiquettes ou toute autre donnée dans le composant dans les composants de fonction
- Syntaxe : const refContainer = useRef()
- Fonction : enregistrez l'objet label, la fonction est la même que React.createRef()
Fragment
utiliser
<Fragment></Fragment>
<></>
La fonction n'a pas besoin d'avoir une véritable balise racine DOM.
Contexte
Comprendre la méthode de communication entre les composants, souvent utilisée pour la communication entre [composant ancêtre] et [composant descendant]
utiliser
// 1.创建Context容器对象
const XxxContext = React.createContext()
// 2.渲染子组件时,外面包裹xxxContext.Provider,通过value属性给后代组件传递数据
<xxxContext.Provider value={
数据}>
子组件
</xxxContext.Provider>
// 3.后代组件读取数据
// 第一种方式:仅适用于类组件
static contextType = xxxContext // 声明接收context
this.context // 读取context中的value数据
// 第二种方式:函数组件与类组件都可以
<xxxContext.Consumer>
{
value => ( // value 为context中的value数据
要显示的内容
)
}
</xxxContext.Consumer>
Notez que le contexte n'est généralement pas utilisé dans le développement d'applications et que son plug-in de réaction encapsulé est généralement utilisé.
Optimisation des composants
2 questions sur le composant
- Tant que setState() est exécuté, le composant restituera() même si les données d'état ne sont pas modifiées ==> Faible efficacité
- Si seul le composant courant est re-render(), le sous-composant sera automatiquement restitué, même si le sous-composant n'utilise aucune donnée du composant parent ==> Faible efficacité
approche efficace
Rendre le rendu uniquement lorsque l'état du composant ou les données des accessoires changent
raison
ShouldComponentUpdate() dans Component renvoie toujours true
résoudre
- Remplacez la méthode ShouldComponentUpdate(), comparez l'ancien et le nouveau état ou les données d'accessoires, renvoyez true s'il y a un changement et renvoyez false s'il n'y a pas de changement.
- Utilisation de PureComponent PureComponent réécrit ShouldComponentUpdate() et renvoie true uniquement si les données d'état ou d'accessoires changent.
Avis:
只是进行state和props数据的浅比较,如果只是数据对象内部数据变了,返回false
不要直接修改state数据,而是要产生新数据
项目中一般使用PureComponent来优化
accessoires de rendu
Comment passer dynamiquement une structure (tag) avec du contenu dans un composant ?
Dans Vue :
使用slot技术,也就是通过组件标签体传入结构`<A><B/></A>`
Pendant Réagir :
使用children props:通过组件标签体传入结构
使用render props:通过组件标签属性传入结构,而且可以携带数据,一般用render函数属性
accessoires pour enfants
<A>
<B>xxxx</B>
</A>
{this.props.children}
问题;如果B组件需要A组件内的数据,==> 做不到
accessoires de rendu
<A render={(data) => <C data={data}></C>}></A>
A组件:{this.props.render(内部state数据)}
C组件:读取A组件传入的数据显示{this.props.data}
limites d'erreur
comprendre:
错误边界(Error boundary):用来捕获后代组件的错误,渲染出备用页面
Caractéristiques:
只能捕获后代组件生命周期产生的错误,不能捕获自己组件产生的错误和其他组件在合成事件、定时器中产生的错误
Comment utiliser:
getDerivedStateFromError pourcomponentDidCatch
// 生命周期函数,一旦后台组件报错就会触发
static getDerivedStateFromError(error){
console.log(error)
// 在render 之前触发
// 返回新的state
return {
hasError:true,
}
}
componentDidCatch(error,info){
// 同级页面的错误,发送请求到后台
console.log(error,info)
}
Résumé des méthodes de communication des composants
Relations entre les composants :
- Composants parent-enfant
- Composants frères (composants non imbriqués)
- Composants grands-parents et petits-enfants (composants inter-niveaux)
Plusieurs modes de communication :
- accessoires :
- accessoires pour enfants
- accessoires de rendu
- Abonnement aux messages-Publier
- pubs-sub、event等
- Gestion centralisée
- redux, dva, etc.
- contexte
- modèle producteur-consommateur
Une meilleure façon de faire correspondre :
父子组件:props
兄弟组件:消息订阅-发布、集中式管理
祖孙组件(跨级组件):消息订阅-发布、集中式管理、conText(开发用的少,封装插件用的多)