কোনও ক্রিয়াকলাপের অংশের অভ্যন্তরে বিক্রিয়া জেএস লাইফাইসাইকেল পদ্ধতি


135

ক্লাসের ভিতরে আমার উপাদানগুলি লেখার পরিবর্তে আমি তার পরিবর্তে ফাংশন সিনট্যাক্সটি ব্যবহার করতে চাই।

আমি কীভাবে ওভাররাইড করব componentDidMount, componentWillMountফাংশনগুলির উপাদানগুলির ভিতরে?
এটা কি সম্ভব?

const grid = (props) => {
    console.log(props);
    let {skuRules} = props;

    const componentDidMount = () => {
        if(!props.fetched) {
            props.fetchRules();
        }
        console.log('mount it!');
    };
    return(
        <Content title="Promotions" breadcrumbs={breadcrumbs} fetched={skuRules.fetched}>
            <Box title="Sku Promotion">
                <ActionButtons buttons={actionButtons} />
                <SkuRuleGrid 
                    data={skuRules.payload}
                    fetch={props.fetchSkuRules}
                />
            </Box>      
        </Content>  
    )
}

1
ক্রিয়ামূলক উপাদানগুলিতে লাইফসাইক্যাল পদ্ধতি থাকার কথা নয়। কারণ তারা কেবল ফাংশন। এবং ফাংশনগুলির কোনও পদ্ধতি নেই। যে জন্য ক্লাস আছে
avalanche1

উত্তর:


149

সম্পাদনা: এটি প্রবর্তনের সাথে সাথে Hooksকার্যক্ষম উপাদানগুলিতে একটি জীবনকালীন আচরণের পাশাপাশি রাজ্যেরও প্রয়োগ করা সম্ভব। এখন

হুক্স একটি নতুন বৈশিষ্ট্য প্রস্তাব যা আপনাকে ক্লাস না লিখে রাজ্য এবং অন্যান্য প্রতিক্রিয়া বৈশিষ্ট্যগুলি ব্যবহার করতে দেয়। এগুলি v16.8.0 এর অংশ হিসাবে প্রতিক্রিয়াতে প্রকাশিত হয়েছে

useEffectহুক জীবনচক্র আচরণ প্রতিলিপি করতে ব্যবহার করা যেতে পারে, এবং useStateএকটি ফাংশন উপাদান মধ্যে রাষ্ট্র সঞ্চয় করতে ব্যবহার করা যেতে পারে।

বেসিক সিনট্যাক্স:

useEffect(callbackFunction, [dependentProps]) => cleanupFunction

আপনি আপনার ব্যবহারের ক্ষেত্রে হুকের মতো প্রয়োগ করতে পারেন

const grid = (props) => {
    console.log(props);
    let {skuRules} = props;

    useEffect(() => {
        if(!props.fetched) {
            props.fetchRules();
        }
        console.log('mount it!');
    }, []); // passing an empty array as second argument triggers the callback in useEffect only after the initial render thus replicating `componentDidMount` lifecycle behaviour

    return(
        <Content title="Promotions" breadcrumbs={breadcrumbs} fetched={skuRules.fetched}>
            <Box title="Sku Promotion">
                <ActionButtons buttons={actionButtons} />
                <SkuRuleGrid 
                    data={skuRules.payload}
                    fetch={props.fetchSkuRules}
                />
            </Box>      
        </Content>  
    )
}

useEffectউপাদানটি আনমাউন্ট করা হলে চালানো কোনও ফাংশনও ফিরিয়ে দিতে পারে। শ্রোতার সদস্যতা বাতিল করতে, এর আচরণের প্রতিরূপে এটি ব্যবহার করা যেতে পারে componentWillUnmount:

উদাহরণস্বরূপ: উপাদানWillUnmount

useEffect(() => {
    window.addEventListener('unhandledRejection', handler);
    return () => {
       window.removeEventListener('unhandledRejection', handler);
    }
}, [])

useEffectনির্দিষ্ট ইভেন্টগুলিতে শর্তাধীন করার জন্য , আপনি এটির পরিবর্তনের জন্য চেক করতে মানগুলির একটি অ্যারে সরবরাহ করতে পারেন:

উদাহরণস্বরূপ: উপাদানডিডআপডেট

componentDidUpdate(prevProps, prevState) {
     const { counter } = this.props;
     if (this.props.counter !== prevState.counter) {
      // some action here
     }
}

হুকস সমান

useEffect(() => {
     // action here
}, [props.counter]); // checks for changes in the values in this array

আপনি যদি এই অ্যারেটি অন্তর্ভুক্ত করেন তবে সময়ের সাথে পরিবর্তিত উপাদান উপাদানগুলি থেকে সমস্ত মানগুলি অন্তর্ভুক্ত করতে ভুলবেন না (প্রপস, রাজ্য), অথবা আপনি পূর্ববর্তী রেন্ডারগুলি থেকে রেফারেন্সিং মানগুলি শেষ করতে পারেন।

ব্যবহারের কিছু সূক্ষ্মতা রয়েছে useEffect; API টি দেখুন Here


V16.7.0 এর আগে

ফাংশন উপাদানগুলির সম্পত্তি হ'ল তাদের কাছে রিয়েটস লাইফসাইकल ফাংশন বা thisকীওয়ার্ডটিতে অ্যাক্সেস নেই । আপনি React.Componentযদি লাইফসাইকেল ফাংশনটি ব্যবহার করতে চান তবে আপনাকে ক্লাসটি প্রসারিত করতে হবে।

class Grid extends React.Component  {
    constructor(props) {
       super(props)
    }

    componentDidMount () {
        if(!this.props.fetched) {
            this.props.fetchRules();
        }
        console.log('mount it!');
    }
    render() {
    return(
        <Content title="Promotions" breadcrumbs={breadcrumbs} fetched={skuRules.fetched}>
            <Box title="Sku Promotion">
                <ActionButtons buttons={actionButtons} />
                <SkuRuleGrid 
                    data={skuRules.payload}
                    fetch={props.fetchSkuRules}
                />
            </Box>      
        </Content>  
    )
  }
}

আপনি যখন অতিরিক্ত যুক্তির প্রয়োজন ছাড়াই আপনার উপাদানটি রেন্ডার করতে চান তখন ফাংশন উপাদানগুলি কার্যকর হয়।


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

1
এটি লক্ষ্য করা উচিত যে এটি হুবহু ডিভাইসডিড আপডেট সমতুল্য নয়। useEffect(() => { // action here }, [props.counter])উপাদান রচনাকালীন ডিপআপ্টেট যখন না দেয় তখন প্রাথমিক রেন্ডারে ট্রিগার হয়।
এস্তাস ফ্লাস্ক

1
passing an empty array as second argument triggers the callback in useEffect only after the initial renderএটি স্টাফ তৈরির নোংরা উপায়ের মতো শোনাচ্ছে: / আশা করি প্রতিক্রিয়াশীল দল ভবিষ্যতের রিলিজগুলিতে আরও ভাল কিছু নিয়ে আসবে।
লুকাশ লিসিস

3
তাই? অংশটি যেখানে আপনি উত্তর দিয়েছিলেন কীভাবে উপাদানওয়ালমাউন্টে কোড চালাবেন?
তোসকান

59

আপনি কার্যক্ষম উপাদানগুলিতে লাইফাইসাইকেল ফাংশন যুক্ত করতে রিঅ্যাক্ট -খাঁটি-জীবনচক্র ব্যবহার করতে পারেন ।

উদাহরণ:

import React, { Component } from 'react';
import lifecycle from 'react-pure-lifecycle';

const methods = {
  componentDidMount(props) {
    console.log('I mounted! Here are my props: ', props);
  }
};

const Channels = props => (
<h1>Hello</h1>
)

export default lifecycle(methods)(Channels);

3
কী Grid? আমি এটি আপনার কোড স্নিপেটে কোথাও সংজ্ঞায়িত দেখতে পাচ্ছি না? আপনি যদি এটির সাথে রিডেক্সও ব্যবহার করতে চান তবে আপনি কি এরকম কিছু নিয়ে পালিয়ে যেতে পারবেন export default lifecycle(methods)(connect({},{})(ComponentName))?
শান ক্ল্যান্সি

@ সিয়ানক্লেন্সি দেরিতে সাড়া দেওয়ার জন্য দুঃখিত। কোড স্নিপেট আপডেট করা হয়েছিল।
যোহান

1
এটি কি একটি ভাল অনুশীলন সম্মত? আমি এইটির কাছে পৌঁছানোর আগেই কি আমার বিভিন্ন সমাধান চেষ্টা করা উচিত বা যদি আমি এটি সবচেয়ে সহজ মনে করি তবে এটি ব্যবহার করা ঠিক আছে?
সুপারসিম্পলপিম্পলডিম্পল

9

সমাধান এক: আপনি নতুন প্রতিক্রিয়া HOOKS API ব্যবহার করতে পারেন । বর্তমানে প্রতিক্রিয়া v16.8.0 এ

হুকস আপনাকে ক্লাস ছাড়াই প্রতিক্রিয়ার আরও কিছু বৈশিষ্ট্য ব্যবহার করতে দেয়। সাজসরঞ্জাম, রাজ্য, কনটেক্সট, refs, এবং: ধারণা আপনি ইতিমধ্যে জানেন প্রতিক্রিয়া হুক্স একটি অধিক প্রত্যক্ষ এপিআই প্রদান জীবনচক্র । হুকস পুনঃনির্মাণের মাধ্যমে সম্বোধিত সমস্ত সমস্যার সমাধান করে।

recompose(এসিডলাইট, অক্টোবর 25 2018) এর লেখকের একটি নোট :

ওহে! আমি প্রায় তিন বছর আগে রেকম্পোজ তৈরি করেছি। এর প্রায় এক বছর পরে আমি রিএ্যাক্ট দলে যোগ দিলাম। আজ, আমরা হুকসের জন্য একটি প্রস্তাব ঘোষণা করেছি। তিন বছর আগে রিকম্পোজ দিয়ে আমি যে সকল সমস্যার সমাধান করার চেষ্টা করেছি সেগুলি হুকগুলি সমাধান করে এবং এর উপরে আরও অনেক কিছু। আমি এই প্যাকেজটির সক্রিয় রক্ষণাবেক্ষণ বন্ধ করব (ভবিষ্যতের প্রতিক্রিয়া প্রকাশের সাথে সামঞ্জস্যের জন্য সম্ভবত বাগফিক্স বা প্যাচগুলি বাদ দিয়ে) এবং লোকেরা পরিবর্তে হুক ব্যবহার করার পরামর্শ দিবে। রেকম্পোজ সহ আপনার বিদ্যমান কোডটি এখনও কাজ করবে, কেবল কোনও নতুন বৈশিষ্ট্য আশা করবেন না।

সমাধান দুটি:

আপনি যদি প্রতিক্রিয়াশীল সংস্করণ ব্যবহার করছেন যা হুক সমর্থন করে না, কোনও উদ্বেগ নেই, পরিবর্তে recompose(ফাংশন উপাদান এবং উচ্চ-অর্ডার উপাদানগুলির জন্য একটি প্রতিক্রিয়া ইউটিলিটি বেল্ট)) ব্যবহার করুন। আপনি কোনও ফাংশন উপাদান recomposeসংযুক্ত lifecycle hooks, state, handlers etcকরার জন্য ব্যবহার করতে পারেন ।

এখানে একটি রেন্ডার-কম উপাদান রয়েছে যা লাইফাইসাইকেল এইচওসি (পুনরায় রচনা থেকে) এর মাধ্যমে জীবনচক্র পদ্ধতিগুলিকে সংযুক্ত করে ।

// taken from https://gist.github.com/tsnieman/056af4bb9e87748c514d#file-auth-js-L33

function RenderlessComponent() {
  return null; 
}

export default lifecycle({

  componentDidMount() {
    const { checkIfAuthed } = this.props;
    // Do they have an active session? ("Remember me")
    checkIfAuthed();
  },

  componentWillReceiveProps(nextProps) {
    const {
      loadUser,
    } = this.props;

    // Various 'indicators'..
    const becameAuthed = (!(this.props.auth) && nextProps.auth);
    const isCurrentUser = (this.props.currentUser !== null);

    if (becameAuthed) {
      loadUser(nextProps.auth.uid);
    }

    const shouldSetCurrentUser = (!isCurrentUser && nextProps.auth);
    if (shouldSetCurrentUser) {
      const currentUser = nextProps.users[nextProps.auth.uid];
      if (currentUser) {
        this.props.setCurrentUser({
          'id': nextProps.auth.uid,
          ...currentUser,
        });
      }
    }
  }
})(RenderlessComponent);

4

আপনি নিজের জীবনচক্র পদ্ধতি তৈরি করতে পারেন।

ইউটিলিটি ফাংশন

import { useEffect, useRef } from "react";

export const componentDidMount = handler => {
  return useEffect(() => {
    return handler();
  }, []);
};

export const componentDidUpdate = (handler, deps) => {
  const isInitialMount = useRef(true);

  useEffect(() => {
    if (isInitialMount.current) {
      isInitialMount.current = false;

      return;
    }

    return handler();
  }, deps);
};

ব্যবহার

import { componentDidMount, componentDidUpdate } from "./utils";

export const MyComponent = ({ myProp }) => {
  componentDidMount(() => {
    console.log("Component did mount!");
  });

  componentDidUpdate(() => {
    console.log("Component did update!");
  });

  componentDidUpdate(() => {
    console.log("myProp did update!");
  }, [myProp]);
};  


0

আপনার যদি প্রতিক্রিয়া লাইফসাইকেল ব্যবহার করতে চান তবে আপনার ক্লাস ব্যবহার করা দরকার।

নমুনা:

import React, { Component } from 'react';

class Grid extends Component {

 constructor(props){
  super(props)
 }

 componentDidMount () { /* do something */ }

 render () { 
   return <h1>Hello</h1>
 }

}

2
আমি ক্লাস ব্যবহার করতে চাই না।
আফতাব নাভিদ

3
প্রশ্নটি ছিল একটি ক্লাস নয়, ক্রিয়ামূলক উপাদান সহ লাইফাইসাইকেল পদ্ধতিগুলি কীভাবে ব্যবহার করবেন।
মাইক

এখন, প্রতিক্রিয়া হুক্স সহ
গ্যাব্রিয়েল

0

আপনি তৈরি-প্রতিক্রিয়া-শ্রেণীর মডিউলটি ব্যবহার করতে পারেন। অফিসিয়াল ডকুমেন্টেশন

অবশ্যই আপনাকে অবশ্যই এটি ইনস্টল করতে হবে

npm install create-react-class

এখানে একটি কাজের উদাহরণ

import React from "react";
import ReactDOM from "react-dom"
let createReactClass = require('create-react-class')


let Clock = createReactClass({
    getInitialState:function(){
        return {date:new Date()}
    },

    render:function(){
        return (
            <h1>{this.state.date.toLocaleTimeString()}</h1>
        )
    },

    componentDidMount:function(){
        this.timerId = setInterval(()=>this.setState({date:new Date()}),1000)
    },

    componentWillUnmount:function(){
        clearInterval(this.timerId)
    }

})

ReactDOM.render(
    <Clock/>,
    document.getElementById('root')
)

0

যদি আপনি 16.8 টি প্রতিক্রিয়া ব্যবহার করেন আপনি প্রতিক্রিয়া হুক ব্যবহার করতে পারেন ... প্রতিক্রিয়া হুকগুলি এমন ফাংশন যা আপনাকে ফাংশন উপাদানগুলি থেকে রাষ্ট্র এবং জীবনচক্রের বৈশিষ্ট্যগুলিকে প্রতিক্রিয়া জানায় ... ডক্স

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