Kāpēc React16 ir svētība React izstrādātājiem

Tāpat kā tas, kā cilvēki ir sajūsmā par savu mobilo lietotņu un OS atjaunināšanu, arī izstrādātājiem vajadzētu būt sajūsminātiem par savu ietvaru atjaunināšanu. Dažādu ietvaru jaunā versija ir aprīkota ar jaunām funkcijām un trikiem.

Tālāk ir norādītas dažas no labajām funkcijām, kas jāņem vērā, migrējot esošo lietotni uz React 16 no React 15.

Laiks atvadīties no reakcijas15?

Kļūdu apstrāde

16. reakcijā tiek ieviests jauns kļūdu robežas jēdziens .

Kļūdu robežas ir React komponenti, kas noķer JavaScript kļūdas jebkurā bērna pakārtoto komponentu kokā. Viņi reģistrē šīs kļūdas un avarējušā komponenta koka vietā parāda rezerves lietotāja interfeisu . Kļūdu robežas aptver kļūdas renderēšanas laikā, dzīves cikla metodēs un visa koka konstruktoros zem tām.

Klases komponents kļūst par kļūdas robežu, ja tas nosaka jaunu dzīves cikla metodi ar nosaukumu componentDidCatch(error, info):

Tad jūs varat to izmantot kā parasto komponentu.

componentDidCatch()Metode darbojas kā JavaScript catch {}bloku, bet komponentiem. Tikai klases komponenti var būt kļūdu robežas. Praksē lielāko daļu laika kļūdu robežas komponentu vēlaties deklarēt vienu reizi. Tad jūs to izmantosiet visā lietojumprogrammā.

Ņemiet vērā, ka kļūdu robežas pieļauj kļūdas tikai komponentos, kas atrodas zem tiem kokā . Kļūdu robeža nevar pieļaut kļūdu sevī. Ja kļūdas robeža neizdodas atveidot kļūdas ziņojumu, kļūda tiks izplatīta uz tuvāko kļūdas robežu virs tās. Arī tas ir līdzīgs tam, kā catch {}bloķēšana darbojas JavaScript.

Apskatiet tiešraides demonstrāciju:

Lai iegūtu papildinformāciju par kļūdu apstrādi, dodieties šeit.

Jauni renderēšanas atgriešanas veidi: fragmenti un virknes

Atbrīvojieties no komponenta ietīšanas divā renderēšanas laikā.

Tagad jūs varat atgriezt elementu masīvu no komponenta rendermetodes. Tāpat kā ar citiem masīviem, katram elementam ir jāpievieno atslēga, lai izvairītos no galvenā brīdinājuma:

render() { // No need to wrap list items in an extra element! return [ // Don't forget the keys :) 
  • First item
  • ,
  • Second item
  • ,
  • Third item
  • , ];}

    Sākot ar React 16.2.0, tam ir īpaša JSX fragmentu sintakse, kurai nav nepieciešamas atslēgas.

    Atbalsts virkņu atgriešanai:

    render() { return 'Look ma, no spans!';}

    Portāli

    Portāli nodrošina pirmās klases veidu, kā padarīt bērnus DOM mezglā, kas pastāv ārpus vecāka komponenta DOM hierarhijas.

    ReactDOM.createPortal(child, container)

    Pirmais arguments ( child) ir jebkurš atveidojams React bērns, piemēram, elements, virkne vai fragments. Otrais arguments ( container) ir DOM elements.

    Kā to izmantot

    Atgriežot elementu no komponenta renderēšanas metodes, tas tiek pievienots DOM kā tuvākā vecāka mezgla bērns:

    render() { // React mounts a new div and renders the children into it return ( {this.props.children} );}

    Dažreiz ir lietderīgi ievietot bērnu citā DOM vietā:

    render() { // React does *not* create a new div. It renders the children into `domNode`. // `domNode` is any valid DOM node, regardless of its location in the DOM. return ReactDOM.createPortal( this.props.children, domNode );}

    Tipisks portālu izmantošanas gadījums ir gadījums, kad vecākajam komponentam ir stils overflow: hiddenvai z-indexstils, bet jums ir nepieciešams, lai bērns vizuāli “izsistu” no tā konteinera. Piemēram, dialoglodziņi, hovercards un rīku padomi.

    Pielāgots DOM atribūts

    React15 izmantoja, lai ignorētu nezināmus DOM atribūtus. Tas tos vienkārši izlaistu, jo React to neatpazina.

    // Your code: 

    Atveidotu DOM tukšu div ar React 15:

    // React 15 output: 

    Reakcijā 16 izeja būs šāda ( tiks parādīti pielāgoti atribūti un tie netiks ignorēti vispār ):

    // React 16 output: 

    Izvairieties no atkārtotas renderēšanas, iestatot stāvoklī NULL

    Izmantojot React16, jūs varat novērst stāvokļa atjaunināšanu un atkārtotu renderēšanu tieši no setState(). Jums vienkārši jāatgriež funkcija null.

    const MAX_PIZZAS = 20;function addAnotherPizza(state, props) { // Stop updates and re-renders if I've had enough pizzas. if (state.pizza === MAX_PIZZAS) { return null; } // If not, keep the pizzas coming! :D return { pizza: state.pizza + 1, }}this.setState(addAnotherPizza);

    Vairāk lasiet šeit.

    Izveidojot atsauces

    Refs izveidošana ar React16 tagad ir daudz vienkāršāka. Kāpēc jums jāizmanto atsauces:

    • Fokusa, teksta izvēles vai multivides atskaņošanas pārvaldība.
    • Obligātu animāciju iedarbināšana.
    • Integrācija ar trešo pušu DOM bibliotēkām.

    Refs are created using React.createRef() and are attached to React elements via the refattribute. Refs are commonly assigned to an instance property when a component is constructed so they can be referenced throughout the component.

    class MyComponent extends React.Component { constructor(props) { super(props); this.myRef = React.createRef(); } render() { return ; }}

    Accessing Refs

    When a ref is passed to an element in render, a reference to the node becomes accessible at the current attribute of the ref.

    const node = this.myRef.current;

    The value of the ref differs depending on the type of the node:

    • When the ref attribute is used on an HTML element, the ref created in the constructor with React.createRef() receives the underlying DOM element as its current property.
    • When the ref attribute is used on a custom class component, the ref object receives the mounted instance of the component as its current.
    • You may not use the ref attribute on functional components because they don’t have instances.

    Context API

    Context provides a way to pass data through the component tree without having to pass props down manually at every level.

    React.createContext

    const {Provider, Consumer} = React.createContext(defaultValue);

    Creates a { Provider, Consumer } pair. When React renders a context Consumer, it will read the current context value from the closest matching Provider above it in the tree.

    The defaultValue argument is only used by a Consumer when it does not have a matching Provider above it in the tree. This can be helpful for testing components in isolation without wrapping them. Note: passing undefined as a Provider value does not cause Consumers to use defaultValue.

    Provider

    A React component that allows Consumers to subscribe to context changes.

    Accepts a value prop to be passed to Consumers that are descendants of this Provider. One Provider can be connected to many Consumers. Providers can be nested to override values deeper within the tree.

    Consumer

     {value => /* render something based on the context value */}

    A React component that subscribes to context changes.

    Requires a function as a child. The function receives the current context value and returns a React node. The value argument passed to the function will be equal to the value prop of the closest Provider for this context above in the tree. If there is no Provider for this context above, the value argument will be equal to the defaultValue that was passed to createContext().

    static getDerivedStateFromProps()

    getDerivedStateFromProps is invoked right before calling the render method. Both on the initial mount and on subsequent updates. It should return an object to update the state, or null to update nothing.

    This method exists for rare use cases where the state depends on changes in props over time. For example, it might be handy for implementing a on> component that compares its previous and next children to decide which of them to animate in and out.

    Deriving state leads to verbose code and makes your components difficult to think about.

    Make sure you’re familiar with simpler alternatives:

    • If you need to perform a side effect (for example, data fetching or an animation) in response to a change in props, use componentDidUpdate lifecycle instead.
    • If you want to re-compute some data only when a prop changes, use a memoization helper instead.
    • If you want to “reset” some state when a prop changes, consider either making a component fully controlled or fully uncontrolled with a key instead.

    This method doesn’t have access to the component instance. If you’d like, you can reuse some code between getDerivedStateFromProps() and the other class methods by extracting pure functions of the component props and state outside the class definition.

    Note that this method is fired on every render, regardless of the cause. This is in contrast to UNSAFE_componentWillReceiveProps. It only fires when the parent causes a re-render and not as a result of a local setState.

    We compare nextProps.someValue with this.props.someValue. If both are different then we perform some operation, setState

    static getDerivedStateFromProps(nextProps, prevState){ if(nextProps.someValue!==prevState.someValue){ return { someState: nextProps.someValue}; } else return null;}

    It receives two params nextProps and prevState. As mentioned previously, you cannot access this inside this method. You’ll have to store the props in the state to compare the nextProps with previous props. In above code nextProps and prevState are compared. If both are different then an object will be returned to update the state. Otherwise null will be returned indicating state update not required. If state changes then componentDidUpdate is called where we can perform the desired operations as we did in componentWillReceiveProps.

    Bonus: React Lifecycle events

    Lifecycle credits — //twitter.com/dceddia

    Well these are some of the features that you should definitely try while working with React16!

    Happy coding ? ?