Maison  >  Article  >  interface Web  >  Utilisation de React : gestion des états dans les composants React

Utilisation de React : gestion des états dans les composants React

不言
不言original
2018-07-20 10:40:572053parcourir

Cet article vous présente l'utilisation de React : la gestion interne de l'état des composants React a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Dans cet article, nous nous concentrerons sur la gestion des états au sein des composants React pour comprendre ou repenser les trois concepts fondamentaux suivants :

  1. props et state

  2. composant fonctionnel

  3. composant de classe

Commençons !

01. Données dans React

Du point de vue des « composants », React divise les données circulant dans l'application en deux types :

Accessoires dont le contenu ne peut pas être modifié mais peut être transmis dans un sens unique entre les composants ;

Le contenu peut être modifié, mais l'état ne peut pas être transmis entre les composants ;

De plus, la différence entre props et state est que les props sont externes et contrôlés par tout code qui restitue ce composant. L'état est interne et contrôlé par le composant lui-même.

Les débutants qui ne sont pas experts en informatique sont souvent confus quant à la relation entre les noms et les significations des accessoires et de l'état. En fait, vous n'avez pas besoin de vous en soucier. Ce ne sont essentiellement qu'un autre nom pour les données, mais dans React, ils le sont. chacun étant soumis à des restrictions ou à des capacités particulières.

Vous pouvez transmettre toutes les données que vous souhaitez transmettre au composant enfant via l'attribut props du composant, tout comme en transmettant des propriétés en HTML. Toutes les propriétés seront stockées dans l'objet this.props du composant enfant (composant de classe).

function Parent(props) {    
return <Child name={"Tom"} />
}function Child(props) {    
return <span>(props.name)</span>
}

02. Composant fonctionnel

Nous avons mentionné précédemment que React utilise des composants pour restituer des vues afin d'améliorer les performances, et qu'un composant est une fonction, et sa fonction peut être exprimée de manière concise avec une formule : f (données) => UI. À ce stade, je pense que vous auriez dû remarquer pourquoi nous disons que React n'est pas un grand framework MVC (ou MVVM), car React n'est responsable que du rendu de la couche de vue (View), et d'autres choses seront complétées par d'autres outils. dans l’écosystème React.

Cela dit, pour les composants React, la forme la plus simple est le composant fonction, qui démontre pleinement la philosophie React consistant à faire une chose à la fois, la composantisation et l'interface utilisateur basée sur les données.

Les composants de fonction sont également appelés « composants sans état », « composants contrôlés » ou « composants de marionnettes » car les composants de fonction sont uniquement responsables de la réception des accessoires et du renvoi de l'interface utilisateur. Dans les scénarios de développement d'applications React réels, nous utilisons souvent des données modifiables. composants fonctionnels autant que possible pour diviser l’ensemble de l’interface utilisateur de l’application en unités visuelles les plus petites possibles.

En effet, le composant fonction est très intuitif, il reçoit l'élément de retour d'attribut, la logique interne est claire et claire et, plus important encore, il n'y a pas de mot-clé this dans le composant fonction, vous n'avez donc jamais à vous soucier de l'ennuyeux "this problème de contexte ».

N'oubliez pas : si votre composant n'a pas besoin de suivre l'état interne, essayez d'utiliser des composants fonctionnels.

03. Composant de classe

Au composant fonctionnel correspond le « composant de classe ». De même, il est également appelé « composant avec état », « composant non contrôlé » et « composant conteneur ». Il convient de noter ici que même si l'on nomme les deux types de composants sous forme de code, cela n'est pas rigoureux, car en JavaScript, les « classes » sont aussi des fonctions.

Contrairement aux composants de fonction, les composants de classe ont des données internes qui peuvent être modifiées : l'état. Cela affecte finalement le rendu de la page, et l'état peut être modifié en interne par le composant à tout moment. Le moment habituel est celui où l'utilisateur interagit avec l'interface.

Parce que React encapsule les données changeantes dans les composants et adhère au principe du flux de données unidirectionnel. Nous disposons de composants d’interface utilisateur très abstraits et encapsulons une logique métier complexe. Cela nous permet de développer de grandes applications en construisant et en combinant une série de petits composants.

Alors, comment ajouter un état à un composant de classe ? C'est simple, tout ce que nous avons à faire est d'ajouter un attribut d'état à l'intérieur du composant de classe, et l'attribut d'état est un objet. Cet objet représente l'état du composant. Chaque nom d'attribut de l'objet représente un état spécifique du composant. Voici le code spécifique :

import React from "react"class Parent extends React.Component {
    state = {
        name: "Eliot",
    }
    
    render() {        return <p>{this.state.name}</p>
    }
}

React 使我们迫使大脑关注两个重要的部分:

组件看起来是什么样?

组件当前的状态是什么?

通过让组件管理自己的状态,任何时候状态的变更都会令 React 自动更新相应的页面部分。这便是使用 React 构建组件的主要优势之一:当页面需要重新渲染时,我们仅仅需要思考的是如何更改状态。我们不必跟踪页面的哪些部分需要更改,不需要决定如何有效的重新呈现页面,React 自会比较先前的输出和新的输出,决定什么应该发生改变,并为我们做出决定。而这个确定之前改变了什么和现在应该新输出什么的过程有一个专门的名词,叫做 Reconciliation。

04. 修改 state

你应该还记得类组件与函数组件最大的不同在于类组件自身拥有可以改变内部数据的能力。那么如何行使这一能力呢?和直觉不同,要做到这一点,你需要使用 React 提供的专门的 API:this.setState()。

你有两种方式使用该 API:

设置对象参数;

设置函数参数;

让我们先来看看第一种:

this.setState({    name: "Tom"})

React 会自动合并对 state 的改变。而有时,你的组件需要一个新的 state ,而这个 state 的变化又依赖于旧的 state值,每当这种时候,你就该使用第二种 API 调用方式:

this.setState((prevState) => ({
    name: "mr." + prevState.name
}))

讲到这里你可能会感到奇怪,只是更新 state 而已,为什么还需要调用一个专门的 API?我们直接修改之前定义的 state对象不就好了吗?之所以这样设计的原因是,组件内 state 的变化不仅仅是对象属性值发生变化那么简单,它还需要驱动整个 UI 进行重新渲染,因此 this.setState() 这个 API 被调用时实际上做了两件事:

修改 state 对象;

驱动组件重新渲染;

如果你对 React 有一定研究,你可能会质疑我以上所罗列的两点并不精确,的确如此,小小的 this.setState() API 其实内部还有很多细节值得注意,例如,当调用 this.setState() 时并不会立即改变 state 的值,也当然不会立即重新渲染组件。例如,当以对象为参数调用 this.setState() API 时,尽管内部重复为数据赋值,最终的数据也只保留最后一次更改的结果。

不过幸好,这些略显古怪的状态早有前人为我们做了详尽的解释,如果你感兴趣,请点击下方链接查询更多的信息:

setState:这个API设计到底怎么样

问一个react更新State的问题?

05. 控制组件

当你在 Web 应用中使用表单时,这个表单的数据被存储于相应的 DOM 节点内部,但正如我们之前提到的,React 的整个关键点就在于如何高效的管理应用内的状态。所以虽然表单的数据被存储于 DOM 中,React 依然可以对它进行状态管理。

而管理的方式即是使用“控制组件”。简单而言,“控制组件”会渲染出一个表单,但是将表单所需的所有真实数据作为 state 存储于组件内部,而不是 DOM 中。

之所以被称为“控制组件”的原因也即在于此,“控制组件”控制着组件内的表单数据,因此,唯一更新表单数据的方式就是更新组件内部对应的 state 值。

import React as "react"class Input extends React.Component {
    state = {
        value: "enter something...",
    }
    
    handleClick: (e) => {        this.setState({value: e.target.value})
    }
    
    render() {
        <input value={this.state.value} onKeyup={this.handleClick} />
    }
}

可以看到,我们使用 handleClick 方法响应用户每一次键盘敲击以即时更新表单状态,这样做不仅天然的支持了即时的输入验证,还允许你有条件的禁止或点亮表单按钮。

06. 小结

这篇文章我们介绍了 React 的两种数据形式:state 和 props,并且介绍了 React 组件的两种形式:函数组件与类组件,希望各位有所收获。

相关推荐:

react的使用: React如何渲染UI

React的使用:react框架的五大特点

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn