উপাদানবিশেষের বিপরীতে লাইভসাইकल পদ্ধতিটি ডাইরাইভস্টেট স্ট্রোমপ্রোপগুলি কীভাবে ব্যবহার করবেন


142

দেখে মনে হচ্ছে componentWillReceivePropsএকটি নতুন লাইফসাইकल পদ্ধতির পক্ষে getDerivedStateFromProps: স্ট্যাটিক গেটডেরাইভস্টেটফ্রোমপ্রসেস () প্রকাশিত আসার ক্ষেত্রে সম্পূর্ণ পর্যায়ক্রমে বের হয়ে যাচ্ছে ।

পরিদর্শন করার পরে, এটা দেখে মনে হচ্ছে আপনি এখন মধ্যে একটি সরাসরি তুলনা করতে অক্ষম this.propsএবং nextProps, মত আপনি তে componentWillReceiveProps। এই কাছাকাছি কোন উপায় আছে?

এছাড়াও, এটি এখন একটি বস্তু ফেরত দেয়। আমি কী ধরে নিচ্ছি যে রিটার্নের মানটি মূলত this.setState?

নীচে আমি অনলাইনে একটি উদাহরণ পেয়েছি: প্রপস / রাজ্য থেকে প্রাপ্ত রাজ্য

আগে

class ExampleComponent extends React.Component {
  state = {
    derivedData: computeDerivedState(this.props)
  };

  componentWillReceiveProps(nextProps) {
    if (this.props.someValue !== nextProps.someValue) {
      this.setState({
        derivedData: computeDerivedState(nextProps)
      });
    }
  }
}

পরে

class ExampleComponent extends React.Component {
  // Initialize state in constructor,
  // Or with a property initializer.
  state = {};

  static getDerivedStateFromProps(nextProps, prevState) {
    if (prevState.someMirroredValue !== nextProps.someValue) {
      return {
        derivedData: computeDerivedState(nextProps),
        someMirroredValue: nextProps.someValue
      };
    }

    // Return null to indicate no change to state.
    return null;
  }
}

উত্তর:


96

অপসারণের সম্পর্কে componentWillReceiveProps: আপনি সংমিশ্রণ সঙ্গে তার ব্যবহারসমূহ হ্যান্ডেল করতে সক্ষম হওয়া উচিত getDerivedStateFromPropsএবং componentDidUpdateদেখতে, ব্লগ পোস্ট প্রতিক্রিয়া উদাহরণ মাইগ্রেশন জন্য। এবং হ্যাঁ, অবজেক্টটি getDerivedStateFromPropsএকইভাবে রাষ্ট্রকে আপডেট করে ফেরত দেওয়া কোনও বস্তুর কাছে ফিরে আসে setState

আপনার যদি কোনও প্রপের সত্যিকারের পুরানো মূল্য প্রয়োজন হয় তবে আপনি সর্বদা এটিকে এমন কিছু দিয়ে আপনার রাজ্যে ক্যাশে করতে পারেন:

state = {
  cachedSomeProp: null
  // ... rest of initial state
};

static getDerivedStateFromProps(nextProps, prevState) {
  // do things with nextProps.someProp and prevState.cachedSomeProp
  return {
    cachedSomeProp: nextProps.someProp,
    // ... other derived state properties
  };
}

রাষ্ট্রকে প্রভাবিত করে না এমন যে কোনও কিছুই beোকানো যেতে পারে componentDidUpdateএবং getSnapshotBeforeUpdateখুব নিম্ন-স্তরের স্টাফের জন্য একটি জিনিসও রয়েছে।

আপডেট: নতুন (এবং পুরাতন) জীবনচক্র পদ্ধতিগুলির জন্য অনুভূতি পেতে, প্রতিক্রিয়া-জীবনকোষ-ভিজ্যুয়ালাইজার প্যাকেজ সহায়ক হতে পারে।


1
ওহ, আমি প্রশ্নটি গোলযোগ করেছি। আমি আসলে বুঝিয়েছিcomponentWillReceiveProps
অ্যান্ড্রু

2
আমি পূর্বের প্রপসগুলি ধরে রাখতে আমার রাজ্যটি ব্যবহার করার কথা ভেবেছিলাম, তবে আমি এটি বাস্তবায়নের জন্য অতিরিক্ত কোড এবং যুক্তিটি এড়াতে সত্যিই চেয়েছিলাম। আপনি যে অন্যান্য জিনিস এনেছেন সেগুলির কয়েকটি আমি অনুসন্ধান করব। অনেক ধন্যবাদ!
অ্যান্ড্রু

4
কোনও রাজ্যে পূর্বের প্রপ সংরক্ষণ করার পক্ষে এই হার্ড-টু-বোধগম্য প্রতিক্রিয়ার এপিআই পরিবর্তনের জন্য কেবল একটি বয়লারপ্ল্যাট কাজ ar অনেক বিকাশকারীদের চোখের জন্য এন্টিপ্যাটার্ন এবং রিগ্রেশন পরিবর্তনের মতো লাগে। আপনাকে ওব্লোসিসের সমালোচনা করা হচ্ছে না, তবে প্রতিক্রিয়া দল।
এক্সেফেক্ট

2
@ অ্যাক্সেসএফেক্ট এটি কারণ স্মৃতিচারণের getDerivedStateFromPropsজন্য আসলেই উদ্দেশ্য কখনও হয়নি । নীচে আমার উত্তরটি দেখুন যেখানে আমি পরিবর্তে প্রস্তাবিত পদ্ধতির বর্ণনা করেছি described
ড্যান আব্রামভ

এটা কি টাইপো? মিস করেছেন ...? এটি হ'ল আমাদের পুরো রাষ্ট্রীয় অবজেক্ট বা কেবলমাত্র সেই অংশটিই আমাদের ফিরিয়ে দেওয়া উচিত।
theprogrammer

51

আমরা সম্প্রতি প্রতিক্রিয়া ব্লগে যেমন পোস্ট করেছি , বেশিরভাগ ক্ষেত্রে আপনার মোটেই প্রয়োজন getDerivedStateFromPropsহয় না

আপনি যদি কেবল কিছু প্রাপ্ত ডেটা গণনা করতে চান তবে:

  1. ভিতরে এটি করুন render
  2. অথবা, যদি এটি পুনরায় গণনা করা ব্যয়বহুল হয় তবে মেমোয়াইজেশন সহায়ক হিসাবে ব্যবহার করুন memoize-one

এখানে সবচেয়ে সহজ "উদাহরণ" উদাহরণ রয়েছে:

import memoize from "memoize-one";

class ExampleComponent extends React.Component {
  getDerivedData = memoize(computeDerivedState);

  render() {
    const derivedData = this.getDerivedData(this.props.someValue);
    // ...
  }
}

পরীক্ষা করে দেখুন ব্লগ পোস্টের এই বিভাগে আরও জানতে।


45
এটা প্রয়োজন না থাকে তাহলে সুবিশাল বেশিরভাগ, তারপর আমি বিস্মিত এটি যেমন একটি অত্যান্ত জরূরী পরিবর্তন ছিল, যেটা কাজ প্রকল্প হাজার হাজার ভঙ্গ করবে। দেখে মনে হচ্ছে রিয়েট টিম ইঞ্জিনিয়ারিং দিয়ে শুরু করেছে।
স্কা

39
উপাদানবিহীনগ্রিপ পপগুলি থেকে ডেরাইভডস্টেটফ্রোমপ্রসগুলিতে পরিবর্তন করুন। এটি ভঙ্গ হচ্ছে না তবে বিদ্যমান বিদ্যমান কোডটি রিফ্যাক্টর করতে বাধ্য করছে, যা অত্যন্ত সময়সাপেক্ষ is এবং খুব অল্প উপকার বলে মনে হচ্ছে যেহেতু আপনি বলছেন যে আপনার পক্ষে এটি বেশিরভাগ ক্ষেত্রেই ব্যবহার করা উচিত নয়। এমন কিছুর জন্য এপিআই পরিবর্তন করার ঝামেলা কেন যাচ্ছেন যা প্রথম স্থানে ব্যবহার করা উচিত নয়।
স্কে

4
আমি ড্যান আব্রামভের এই মন্তব্যের প্রতিক্রিয়া পছন্দ করব।
লুই 345

6
@ ড্যানআব্রামভ এই পরিবর্তন কেন আসলো এর কোনও উত্তর?
পেট্রোস কিরিয়াকু

3
আসলে আমাদের প্রকল্পগুলিতে এটি প্রচুর ব্যবহৃত হয়। যখন নতুন ডেটা নেমে আসে তার জন্য স্ক্রিনে স্নাকবার্সের মতো জিনিসগুলি দেখানোর জন্য, উদাহরণ 1। componentWillReceivePropsসহজ ছিল এবং এটি কাজ করে। কেন এই স্থির আবর্জনার জন্য এটি সরান ...
অলিভার ডিকসন

6

যেমনটি ড্যান আব্রামভ উল্লেখ করেছেন

রেন্ডার ভিতরে এটি করুন

রাষ্ট্রের গণনাগুলিতে যে কোনও প্রক্সি প্রপসের জন্য আমরা মেমোয়েসের সাথে সেই পদ্ধতির ব্যবহার করি।

আমাদের কোডটি এইভাবে দেখায়

// ./decorators/memoized.js  
import memoizeOne from 'memoize-one';

export function memoized(target, key, descriptor) {
  descriptor.value = memoizeOne(descriptor.value);
  return descriptor;
}

// ./components/exampleComponent.js
import React from 'react';
import { memoized } from 'src/decorators';

class ExampleComponent extends React.Component {
  buildValuesFromProps() {
    const {
      watchedProp1,
      watchedProp2,
      watchedProp3,
      watchedProp4,
      watchedProp5,
    } = this.props
    return {
      value1: buildValue1(watchedProp1, watchedProp2),
      value2: buildValue2(watchedProp1, watchedProp3, watchedProp5),
      value3: buildValue3(watchedProp3, watchedProp4, watchedProp5),
    }
  }

  @memoized
  buildValue1(watchedProp1, watchedProp2) {
    return ...;
  }

  @memoized
  buildValue2(watchedProp1, watchedProp3, watchedProp5) {
    return ...;
  }

  @memoized
  buildValue3(watchedProp3, watchedProp4, watchedProp5) {
    return ...;
  }

  render() {
    const {
      value1,
      value2,
      value3
    } = this.buildValuesFromProps();

    return (
      <div>
        <Component1 value={value1}>
        <Component2 value={value2}>
        <Component3 value={value3}>
      </div>
    );
  }
}

এর সুবিধাগুলি হ'ল আপনার ভিতরে টন তুলনা বোয়লারপ্লেটের কোড দরকার নেই getDerivedStateFromPropsবা componentWillReceivePropsআপনি কোনও কন্সট্রাক্টরের ভিতরে অনুলিপি-পেস্ট শুরু করতে পারেন।

বিঃদ্রঃ:

এই পদ্ধতিরটি কেবলমাত্র প্রপসকে প্র্যাক্সিং করার জন্য ব্যবহার করা হয়, যদি আপনার কিছু অভ্যন্তরীণ রাষ্ট্র যুক্তি থাকে তবে এটি এখনও উপাদান লাইফসাইকেলে পরিচালনা করতে হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.