Kodėl „React16“ yra palaiminimas „React“ kūrėjams

Kaip ir tai, kaip žmonės džiaugiasi atnaujinę mobilias programas ir OS, kūrėjai taip pat turėtų džiaugtis atnaujinę savo sistemas. Naujoje skirtingų struktūrų versijoje yra naujų funkcijų ir gudrybių.

Toliau pateikiamos kelios geros savybės, į kurias turėtumėte atsižvelgti perkeliant esamą programą į „React 16“ iš „React 15“.

Laikas atsisveikinti React15?

Klaida tvarkant

16 reakcijoje pristatoma nauja klaidų ribos samprata .

Klaidų ribos yra „React“ komponentai, užfiksuojantys „JavaScript“ klaidas bet kurioje antrinio komponento medžio vietoje. Jie registruoja tas klaidas ir vietoje sudužusio komponento medžio rodo atsarginę vartotojo sąsają . Klaidų ribos užfiksuoja klaidas perteikimo metu, gyvavimo ciklo metoduose ir viso po jais esančio medžio konstruktoriuose.

Klasės komponentas tampa klaidos riba, jei jis apibrėžia naują gyvavimo ciklo metodą, vadinamą componentDidCatch(error, info):

Tada galite jį naudoti kaip įprastą komponentą.

componentDidCatch()Metodas veikia kaip JavaScript catch {}bloko, bet komponentus. Tik klasės komponentai gali būti klaidų ribos. Praktiškai dažniausiai klaidos ribos komponentą norėsite deklaruoti vieną kartą. Tada naudosite ją visoje savo programoje.

Atminkite, kad klaidų ribos klaidas fiksuoja tik komponentuose, esančiuose po jais medyje . Klaidos riba negali užfiksuoti klaidos savyje. Jei klaidos riba nepavyksta pateikti klaidos pranešimo, klaida plinta į artimiausią klaidos ribą virš jos. Tai taip pat panašu į tai, kaip catch {}blokas veikia „JavaScript“.

Peržiūrėkite tiesioginę demonstraciją:

Norėdami gauti daugiau informacijos apie klaidų tvarkymą, eikite čia.

Nauji atvaizdavimo grąžinimo tipai: fragmentai ir eilutės

Atsikratykite komponento įvyniojimo į div, kai pateikiate.

Dabar galite grąžinti elementų masyvą iš komponento rendermetodo. Kaip ir kituose masyvuose, prie kiekvieno elemento turite pridėti raktą, kad išvengtumėte pagrindinio įspėjimo:

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

    Pradedant nuo „React 16.2.0“, jis palaiko specialią JSX fragmento sintaksę, kuriai nereikia raktų.

    Stygų grąžinimo palaikymas:

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

    Portalai

    Portalai suteikia aukščiausios klasės būdą paversti vaikus DOM mazgu, esančiu už pirminio komponento DOM hierarchijos ribų.

    ReactDOM.createPortal(child, container)

    Pirmasis argumentas ( child) yra bet kuris atvaizduojamas React vaikas, pvz., Elementas, eilutė ar fragmentas. Antrasis argumentas ( container) yra DOM elementas.

    Kaip juo naudotis

    Kai grąžinate elementą iš komponento pateikimo metodo, jis yra prijungtas prie DOM kaip artimiausio pirminio mazgo vaikas:

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

    Kartais naudinga įterpti vaiką į kitą 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 );}

    Tipiškas portalų naudojimo atvejis yra tada, kai pagrindinis komponentas turi overflow: hiddenarba z-indexstilių, bet jums reikia, kad vaikas vizualiai „išsiveržtų“ iš savo talpyklos. Pavyzdžiui, dialogai, pelės žymekliai ir patarimai.

    Tinkintas DOM atributas

    „React15“ naudojama ignoruoti nežinomus DOM atributus. Tai jų tiesiog praleistų, nes „React“ to neatpažino.

    // Your code: 

    Pateiktų DOM tuščią div su React 15:

    // React 15 output: 

    „React16“ išvestis bus tokia ( bus rodomi pasirinktiniai atributai, kurie nebus visiškai ignoruojami ):

    // React 16 output: 

    Venkite pakartotinio pateikimo nustatydami būseną NULL

    Naudodami „React16“ galite užkirsti kelią būsenos atnaujinimams ir pakartotiniam pateikimui setState(). Jums tiesiog reikia grąžinti jūsų funkciją 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);

    Skaitykite daugiau čia.

    Kurti nuorodas

    Dabar „React16“ sukurti žymes yra daug lengviau. Kodėl reikia naudoti nuorodas:

    • Dėmesio, teksto pasirinkimo ar medijos atkūrimo valdymas.
    • Suaktyvinamos imperatyvios animacijos.
    • Integracija su trečiųjų šalių DOM bibliotekomis.

    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 ? ?