Miksi React16 on siunaus React-kehittäjille

Aivan kuten ihmiset ovat innoissaan mobiilisovellustensa ja käyttöjärjestelmänsa päivittämisestä, myös kehittäjien tulisi olla innoissaan päivittää kehyksensä. Eri kehysten uudessa versiossa on uusia ominaisuuksia ja temppuja.

Alla on joitain hyviä ominaisuuksia, jotka kannattaa ottaa huomioon siirrettäessä nykyinen sovelluksesi React 16: een React 15: sta.

Aika sanoa Goodbye React15?

Virheiden käsittely

React 16 esittelee uuden virherajan käsitteen .

Virherajat ovat React-komponentteja, jotka tarttuvat JavaScript-virheisiin missä tahansa alikomponenttipuussa. He kirjaavat nämä virheet ja näyttävät varakäyttöliittymän kaatuneen komponenttipuun sijaan. Virherajat tarttuvat virheisiin renderoinnin aikana, elinkaarimenetelmissä ja niiden alapuolella olevan koko puun rakentajissa.

Luokkakomponentista tulee virheraja, jos se määrittelee uuden elinkaarimenetelmän nimeltä componentDidCatch(error, info):

Sitten voit käyttää sitä tavallisena komponenttina.

componentDidCatch()Menetelmä toimii kuten JavaScript catch {}lohko, mutta komponenttien. Vain luokan komponentit voivat olla virherajoja. Käytännössä sinun on usein ilmoitettava virherajan komponentti kerran. Sitten käytät sitä koko sovelluksessasi.

Huomaa, että virherajat saavat kiinni virheistä vain puun alla olevissa komponenteissa . Virheraja ei saa kiinni virheestä itsessään. Jos virheraja epäonnistuu yrittämällä virhesanomaa, virhe etenee lähimpään virherajaan sen yläpuolella. Tämäkin muistuttaa catch {}lohkon toimintaa JavaScriptissä.

Katso live-esittely:

Lisätietoja virheiden käsittelystä on täällä.

Uudet render-palautustyypit: fragmentit ja merkkijonot

Päästä eroon komponentin käärimisestä diviin renderoinnin aikana.

Voit nyt palauttaa joukon elementtejä komponentin rendermenetelmästä. Kuten muidenkin taulukoiden kohdalla, sinun on lisättävä jokaiseen elementtiin avain välttääksesi avaimen varoituksen:

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

    React 16.2.0: sta alkaen sillä on tuki erityiselle JSX: n fragmenttisyntaksille, joka ei vaadi avaimia.

    Tuki merkkijonojen palauttamiselle:

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

    Portaalit

    Portaalit tarjoavat ensiluokkaisen tavan tehdä lapsista DOM-solmu, joka on vanhemman komponentin DOM-hierarkian ulkopuolella.

    ReactDOM.createPortal(child, container)

    Ensimmäinen argumentti ( child) on mikä tahansa renderöitävä React-lapsi, kuten elementti, merkkijono tai fragmentti. Toinen argumentti ( container) on DOM-elementti.

    Kuinka käyttää sitä

    Kun palautat elementin komponentin renderöintimenetelmästä, se asennetaan DOM: iin lähimmän yläsolmun alatasona:

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

    Joskus on hyödyllistä lisätä lapsi toiseen paikkaan DOM: ssä:

    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 );}

    Tyypillinen portaalien käyttötapaus on, kun vanhemmalla komponentilla on tyyli overflow: hiddentai z-indextyyli, mutta sinun täytyy lapsen visuaalisesti "purkautua" säiliöstä. Esimerkiksi valintaikkunat, leijukortit ja työkaluvihjeet.

    Mukautettu DOM-attribuutti

    React15-ohjelmaa käytettiin ohittamaan tuntemattomat DOM-määritteet. Se vain ohittaa ne, koska React ei tunnistanut sitä.

    // Your code: 

    Renderoi tyhjän div: n DOM: iin reaktiolla 15:

    // React 15 output: 

    React16: ssa lähtö on seuraava ( mukautetut määritteet näytetään eikä niitä jätetä lainkaan huomiotta ):

    // React 16 output: 

    Vältä Re-render-asetusta asettamalla NULL-tila tilaan

    React16: lla voit estää tilapäivitykset ja uudelleentoiminnot heti setState(). Sinun tarvitsee vain palauttaa toimintosi 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);

    Lue lisää täältä.

    Viitteiden luominen

    Viitteiden luominen React16: lla on nyt paljon helpompaa. Miksi sinun on käytettävä viitteitä:

    • Kohdistuksen, tekstin valinnan tai median toiston hallinta.
    • Pakollisten animaatioiden käynnistäminen.
    • Integrointi kolmansien osapuolten DOM-kirjastoihin.

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