Зашто је Реацт16 благослов за Реацт програмере

Баш као што су људи узбуђени због ажурирања својих мобилних апликација и ОС-а, програмери би такође требали бити узбуђени што ће ажурирати своје оквире. Нова верзија различитих оквира долази са новим могућностима и триковима.

Испод су неке од добрих карактеристика које бисте требали узети у обзир приликом миграције постојеће апликације на Реацт 16 из Реацт 15.

Време је да кажете збогом Реацт15?

Грешка руковање

Реацт 16 представља нови концепт границе грешке .

Границе грешака су Реацт компоненте које хватају ЈаваСцрипт грешке било где у свом стаблу подређених компонената. Они евидентирају те грешке и приказују резервни УИ уместо срушеног стабла компонената. Границе грешака хватају грешке током приказивања, у методама животног циклуса и у конструкторима целог стабла испод њих.

Компонента класе постаје граница грешке ако дефинише нову методу животног циклуса која се назива componentDidCatch(error, info):

Тада га можете користити као редовну компоненту.

componentDidCatch()Метода ради као ЈаваСцрипт catch {}блок, али за компоненте. Границе грешака могу бити само компоненте класе. У пракси ћете већину времена желети да једном декларишете компоненту границе грешке. Тада ћете га користити у целој апликацији.

Имајте на уму да границе грешака хватају грешке само у компонентама испод њих у стаблу . Граница грешке не може ухватити грешку у себи. Ако граница грешке не успе да покуша да прикаже поруку о грешци, грешка ће се проширити на најближу границу грешке изнад ње. Ово је такође слично начину на који catch {}блок ради у ЈаваСцрипт-у.

Погледајте демонстрацију уживо:

За више информација о руковању грешкама, погледајте овде.

Нови типови враћања приказа: фрагменти и низови

Решите се умотавања компоненте у див током приказивања.

Сада можете вратити низ елемената из renderметоде компоненте . Као и код осталих низова, мораћете да додате кључ сваком елементу да бисте избегли упозорење о кључу:

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

    Почевши од Реацт 16.2.0, има подршку за посебну синтаксу фрагмената за ЈСКС која не захтева кључеве.

    Подршка за повратне низове:

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

    Портали

    Портали пружају првокласни начин за приказивање деце у ДОМ чвор који постоји изван ДОМ хијерархије надређене компоненте.

    ReactDOM.createPortal(child, container)

    Први аргумент ( child) је било које детект Реацт који се може приказати, као што је елемент, низ или фрагмент. Други аргумент ( container) је ДОМ елемент.

    Како употребљавати

    Када вратите елемент из методе приказивања компоненте, он се монтира у ДОМ као подређени најближи родитељски чвор:

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

    Понекад је корисно дете уметнути на друго место у ДОМ-у:

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

    Типичан случај употребе портала је када родитељска компонента има overflow: hiddenили z-indexстил, али треба да дете визуелно „избије“ из свог контејнера. На пример, дијалози, ховеркарте и описи алата.

    Прилагођени ДОМ атрибут

    Реацт15 је игнорисао било које непознате ДОМ атрибуте. Једноставно би их прескочио јер Реацт то није препознао.

    // Your code: 

    Рендерисао би празан див у ДОМ са Реацт 15:

    // React 15 output: 

    У Реацт16, излаз ће бити следећи ( прилагођени атрибути ће бити приказани и неће се уопште занемарити ):

    // React 16 output: 

    Избегавајте поновно приказивање постављањем НУЛЛ у стање

    Помоћу Реацт16 можете спречити ажурирање стања и поновно приказивање одмах setState(). Потребно је само да вам се функција врати 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);

    Прочитајте више овде.

    Стварање реф

    Стварање референци помоћу Реацт16 сада је много лакше. Зашто треба да користите реф:

    • Управљање фокусом, избором текста или репродукцијом медија.
    • Окидање императивних анимација.
    • Интегрисање са независним ДОМ библиотекама.

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