ভাইবোন / পিতামাতার উপাদানগুলিতে ফর্ম এলিমেন্ট স্টেটটি উত্তীর্ণ করার সঠিক উপায় কী?


186
  • ধরুন আমার কাছে একটি প্রতিক্রিয়া শ্রেণি পি রয়েছে, যা দুটি শিশু শ্রেণি, সি 1 এবং সি 2 সরবরাহ করে।
  • সি 1 এ একটি ইনপুট ক্ষেত্র রয়েছে। আমি এই ইনপুট ক্ষেত্রটিকে ফু হিসাবে উল্লেখ করব।
  • আমার লক্ষ্য সি-কে ফু-র পরিবর্তনের বিষয়ে প্রতিক্রিয়া জানানো।

আমি দুটি সমাধান নিয়ে এসেছি, কিন্তু তাদের উভয়ই বেশ সঠিকভাবে অনুভব করে না।

প্রথম সমাধান:

  1. পি কে একটি রাষ্ট্র অর্পণ করুন, state.input ,।
  2. onChangeপি তে একটি ফাংশন তৈরি করুন যা একটি ইভেন্ট এবং সেটগুলি নেয়state.input
  3. এই পাস onChangeহিসেবে গ 1 থেকে props, এবং গ 1 বেঁধে দিন this.props.onChangeথেকে onChangefoo বিন্যাস।

এইটা কাজ করে. যখনই ফু এর মান পরিবর্তন হয়, এটি asetState , তাই পি এর সি 2 এ যাওয়ার জন্য ইনপুট থাকে।

তবে এটি একই কারণে পুরোপুরি সঠিক বলে মনে হচ্ছে না: আমি একটি শিশু উপাদান থেকে পিতামাতার উপাদানটি স্থির করছি। এটি প্রতিক্রিয়াটির নকশার নীতিকে বিশ্বাসঘাতক বলে মনে হচ্ছে: একক-দিকের ডেটা প্রবাহ।
এটি কি আমার এটি করার কথা, বা এর থেকেও আরও একটি প্রাকৃতিক সমাধান আছে?

দ্বিতীয় সমাধান:

স্রেফ ফুতে পি।

তবে আমি যখন আমার অ্যাপ্লিকেশনটি তৈরি করি all সমস্ত renderস্তরের উপাদানগুলিকে সর্বোচ্চ স্তরের শ্রেণিতে রাখি তখন আমার কি এমন ডিজাইনের নীতিটি অনুসরণ করা উচিত ?

আমার উদাহরণের মতো, যদি আমার কাছে সি 1 এর একটি বড় রেন্ডারিং থাকে তবে আমি সত্যিই পুরো renderসি 1 এর পুরোপুরি রাখতে চাই নাrender এর পি কারণ সি 1 এর একটি ফর্ম উপাদান রয়েছে।

আমি এটা কিভাবে করব?


আমি ঠিক একই জিনিসটি করতে চলেছি এবং এটি সঠিকভাবে কাজ করা সত্ত্বেও, আমার মনে হচ্ছে এটি কেবল একটি দৈত্য হ্যাক
মিরকো

উত্তর:


198

সুতরাং, যদি আমি আপনাকে সঠিকভাবে বুঝতে পারি তবে আপনার প্রথম সমাধানটি আপনাকে বোঝাচ্ছে যে আপনি নিজের মূল উপাদানটিতে রাষ্ট্র রাখছেন? আমি প্রতিক্রিয়ার স্রষ্টাদের পক্ষে কথা বলতে পারি না, তবে সাধারণত, আমি এটি একটি সঠিক সমাধান বলে মনে করি।

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

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

class Example extends React.Component {
  constructor (props) {
    super(props)
    this.state = { data: 'test' }
  }
  render () {
    return (
      <div>
        <C1 onUpdate={this.onUpdate.bind(this)}/>
        <C2 data={this.state.data}/>
      </div>
    )
  }
  onUpdate (data) { this.setState({ data }) }
}

class C1 extends React.Component {
    render () {
      return (
        <div>
          <input type='text' ref='myInput'/>
          <input type='button' onClick={this.update.bind(this)} value='Update C2'/>
        </div>
      )
    }
    update () {
      this.props.onUpdate(this.refs.myInput.getDOMNode().value)
    }
})

class C2 extends React.Component {
    render () {
      return <div>{this.props.data}</div>
    }
})

ReactDOM.renderComponent(<Example/>, document.body)

5
সমস্যা নেই. আমি প্রকৃতপক্ষে এই পোস্টটি লেখার পরে ফিরে গিয়েছিলাম এবং কিছু ডকুমেন্টেশন আবারও পড়েছি এবং এটি তাদের চিন্তাভাবনা এবং সেরা অনুশীলনের সাথে একত্রে অন্তর্নিহিত বলে মনে হচ্ছে। প্রতিক্রিয়াটির সত্যই দুর্দান্ত ডকুমেন্টেশন রয়েছে এবং প্রতিবারই আমি ভাবছি যে কোথায় যাওয়া উচিত, তারা সাধারণত এটি ডক্সের কোথাও coveredেকে রাখে। রাজ্যের বিভাগটি এখানে দেখুন, ফেসবুক.
github.io/react/docs/…

@captray কিন্তু কি সম্পর্কে, যদি C2একটি আছে getInitialStateডেটার জন্য ভিতরে renderএটি ব্যবহার করে this.state.data?
দিমিত্রি পলুশকিন

2
@ দিমিত্রিপলুশকিন যদি আমি আপনার প্রশ্নটি সঠিকভাবে বুঝতে পারি তবে আপনি আপনার রুট উপাদান থেকে ডেটা প্রপস হিসাবে সি 2 তে প্রেরণ করতে চান। সি 2-তে, সেই ডেটা প্রাথমিক অবস্থা হিসাবে সেট করা হবে (যেমন getInitialState: ফাংশন () {রিটার্ন {কিছু ডেটা: this.prop.dataFromParentThatWillChange}} এবং আপনি উপাদানটি উইল রিসিপপ্রসগুলি বাস্তবায়ন করতে এবং এই আপডেট করার জন্য নতুন প্রপস সহ এই.সেটস্টেটকে কল করতে চান সি 2 তে রাজ্য। যেহেতু আমি প্রাথমিকভাবে উত্তর দিয়েছি, আমি ফ্লাক্স ব্যবহার করে আসছি, এবং আপনাকে এটির দিকেও নজর দেওয়ার সুপারিশ করবে It এটি আপনার উপাদানগুলিকে আরও পরিষ্কার করে তোলে এবং রাষ্ট্র সম্পর্কে আপনার চিন্তাভাবনা বদলে দেবে
ক্যাপচার করুন

3
@ দিমিত্রিপলুশকিন আমি এটি অনুসরণ করতে পোস্ট করতে চেয়েছিলাম। ফেসবুক. github.io/react/tips/… যতক্ষণ আপনি জানেন আপনি কী করছেন এবং আপনি জানেন যে ডেটা পরিবর্তন হতে চলেছে, তবে অনেক পরিস্থিতিতে আপনি সম্ভবত জিনিসগুলিকে স্থানান্তর করতে পারেন। আপনার এটি এটিকে শ্রেণিবিন্যাস হিসাবে গড়ে তুলতে হবে না তাও লক্ষ করা গুরুত্বপূর্ণ। আপনি ডিওএম-এর বিভিন্ন স্থানে সি 1 এবং সি 2 মাউন্ট করতে পারেন এবং তারা উভয়ই কিছু ডেটাতে ইভেন্টগুলি শুনতে শুনতে পারেন। আমি দেখতে পাচ্ছি প্রচুর লোকেরা যখন শ্রেণিবদ্ধ উপাদানগুলির প্রয়োজন হয় না তখন তাদের প্রয়োজন হয় না।
ক্যাপচার করুন

5
উপরের কোডটিতে দুটি বাগ রয়েছে - যার মধ্যে দুটিই সঠিক প্রসঙ্গে "এটি" আবদ্ধ না করে জড়িত, আমি উপরোক্ত সংশোধন করেছি এবং যার জন্য কোডেপেন প্রদর্শনের প্রয়োজন রয়েছে: কোডেপেন.আইও
অ্যালেক্স এইচ

34

এখনই অ্যাপ্লিকেশন তৈরি করতে প্রতিক্রিয়া ব্যবহার করে, আমি অর্ধ বছর আগে জিজ্ঞাসা করা এই প্রশ্নের সাথে কিছু চিন্তা ভাগ করতে চাই।

আমি আপনাকে পড়তে পরামর্শ দিচ্ছি

আপনার পোস্ট অ্যাপটি কীভাবে গঠন করা উচিত তা বোঝার জন্য প্রথম পোস্টটি অত্যন্ত সহায়ক।

সর্দি প্রশ্নের উত্তর কেন আপনি গঠন করা উচিত আপনার এই ভাবে অ্যাপ্লিকেশন প্রতিক্রিয়া (যেমন বিরোধিতা কিভাবে এটি গঠন করবেন তার )প্রতিক্রিয়া হ'ল সিস্টেমের মাত্র 50%, এবং ফ্লাক্সের সাথে আপনি পুরো ছবিটি দেখতে পাবেন এবং তারা কীভাবে একটি সুসংগত সিস্টেম গঠন করে তা দেখতে পাবেন।

প্রশ্ন ফিরে।

আমার প্রথম সমাধানটির জন্য, হ্যান্ডলারটিকে বিপরীত দিকে যেতে দেওয়া ঠিকঠাক , কারণ ডেটা এখনও একক-দিক দিয়ে চলেছে।

তবে কোনও হ্যান্ডলারকে পি-তে একটি সেটস্টেট ট্রিগার করা আপনার পরিস্থিতি অনুসারে সঠিক বা ভুল হতে পারে কিনা।

অ্যাপ্লিকেশনটি যদি একটি সহজ মার্কডাউন রূপান্তরকারী হয়, সি 1 হ'ল কাঁচা ইনপুট এবং সি 2 এইচটিএমএল আউটপুট হওয়ায়, সি 1 কে পি-তে একটি সেটস্টেট ট্রিগার করতে দেওয়া ঠিক আছে, তবে কারও কারও পক্ষে যুক্তি হতে পারে এটি এটি করার প্রস্তাবিত উপায় নয়।

তবে, যদি অ্যাপ্লিকেশনটি একটি টুডো তালিকা হয় তবে সি 1 এইচটিএমএলে একটি নতুন টোডো তৈরি করতে ইনপুট, সি 2 টুডো তালিকা রয়েছে, আপনি সম্ভবত হ্যান্ডলারটিকে পি এর চেয়ে দুই স্তরের উপরে যেতে চান - dispatcherযা storeআপডেটটি আপডেট করতে দেয় data store, যা তখন পি তে ডেটা প্রেরণ করে এবং দর্শনগুলি পপুলেট করে। ফ্লাক্স নিবন্ধটি দেখুন। এখানে একটি উদাহরণ: ফ্লাক্স - টডোএমভিসি

সাধারণত, আমি টুডো তালিকার উদাহরণে বর্ণিত পদ্ধতিটিকে পছন্দ করি। আপনার অ্যাপে যত কম রাজ্য রয়েছে তত ভাল।


7
আমি প্রায়শই প্রতিক্রিয়া এবং ফ্লাক্স উভয়ের উপস্থাপনাগুলিতে এটি আলোচনা করি। আমি যে বিষয়টির উপরে চাপ দেওয়ার চেষ্টা করছি তা হ'ল আপনি উপরে বর্ণিত এবং এটি হল ভিউ স্টেট এবং অ্যাপ্লিকেশন স্টেটের বিচ্ছেদ tion এমন পরিস্থিতি রয়েছে যেখানে জিনিসগুলি কেবলমাত্র ভিউ স্টেট থেকে অ্যাপ্লিকেশন স্টেটে পরিণত হতে পারে, বিশেষত এমন পরিস্থিতিতে যেখানে আপনি ইউআইয়ের রাজ্যটি সংরক্ষণ করছেন (পূর্বনির্ধারিত মানগুলির মতো)। আমি মনে করি এটি দুর্দান্ত যে আপনি এক বছর পরে নিজের চিন্তা নিয়ে ফিরে এসেছেন। +1
11:51

@ ক্যাপট্রে তাই আমরা কি বলতে পারি যে রিডুএক্স সব পরিস্থিতিতে প্রতিক্রিয়া অপেক্ষা শক্তিমান? তাদের শেখার বক্রতা সত্ত্বেও ... (জাভা থেকে আগত)
ব্রুস সান

আপনি কি বোঝাতে চাচ্ছেন তা আমি নিশ্চিত নই. তারা দুটি ভিন্ন জিনিস খুব ভালভাবে পরিচালনা করে এবং উদ্বেগের যথাযথ বিচ্ছেদ are
14

1
আমাদের কাছে রিডুএক্স ব্যবহার করে একটি প্রকল্প রয়েছে এবং কয়েক মাস এটিতে মনে হয় যেন সমস্ত কিছুর জন্য ক্রিয়া ব্যবহৃত হয়। এটি স্প্যাগেটি কোডের এই বড় মিশ্রণের মতো এবং বোঝা অসম্ভব, সম্পূর্ণ বিপর্যয়। রাজ্য পরিচালনা ভাল হতে পারে, তবে সম্ভবত গুরুতর ভুল বোঝাবুঝি। এই ধারণাটি নেওয়া কি নিরাপদ যে বিশ্বব্যাপী অ্যাক্সেস করা দরকার এমন রাজ্যের অংশগুলির জন্যই ফ্লাক্স / রিডাক্স ব্যবহার করা উচিত?
wayofthefuture

1
@ ওয়েফথফিউচার আপনার কোড না দেখে, আমি বলতে পারি যে আমি ভাল ওলে স্প্যাগেটি jQuery এর মতো অনেক স্প্যাগেটি প্রতিক্রিয়া দেখছি। আমি দিতে পারি সেরা পরামর্শটি চেষ্টা করুন এবং এসআরপি অনুসরণ করুন। আপনার উপাদানগুলি যথাসম্ভব সহজ করুন; বোবা রেন্ডারিং উপাদানগুলি যদি আপনি পারেন তবে। আমি <ডেটাপ্রোভাইডার /> উপাদানটির মতো বিমূর্তকরণের জন্যও চাপ দিই। এটি একটি জিনিস ভাল করে। তথ্য সরবরাহ করুন। এটি সাধারণত 'রুট' উপাদান হয়ে ওঠে এবং বাচ্চাদের (এবং ক্লোনিং) প্রপস (সংজ্ঞায়িত চুক্তি) হিসাবে উপকারের মাধ্যমে ডেটা পাস করে। শেষ পর্যন্ত সার্ভারে প্রথমে চিন্তা করার চেষ্টা করুন। এটি আপনার জেএসকে আরও ভাল ডেটা স্ট্রাকচার দিয়ে আরও ক্লিনার করে তুলবে।
2:13

5

রাষ্ট্রটিকে প্যারেন্ট উপাদানগুলিতে রাখার সাথে প্রথম সমাধানটি হ'ল সঠিক । তবে আরও জটিল সমস্যার জন্য কিছু স্টেট ম্যানেজমেন্ট লাইব্রেরি সম্পর্কে আপনার ভাবা উচিত , রিডাক্স রিএ্যাক্টের সাথে ব্যবহৃত সবচেয়ে জনপ্রিয়।


একমত। যখন বেশিরভাগ "খাঁটি প্রতিক্রিয়া" তে জিনিস লিখছিলেন তখন আমার প্রতিক্রিয়া ফিরে লেখা হয়েছিল। প্রবাহের আগে।
'17 এ

5

পাঁচ বছর পরে রিএ্যাক্ট হুকের প্রবর্তনের সাথে ব্যবহারের ব্যবহারের কনটেক্সট হুক দিয়ে এটি করার আরও অনেক মার্জিত উপায় রয়েছে।

আপনি গ্লোবাল স্কোপগুলিতে প্রসঙ্গটি সংজ্ঞায়িত করুন, প্যারেন্ট উপাদানগুলিতে রফতানি ভেরিয়েবল, অবজেক্টস এবং ক্রিয়াকলাপগুলি সরবরাহ করুন এবং তারপরে একটি প্রসঙ্গে প্রযোজ্য শিশুদের অ্যাপ্লিকেশনটিতে মোড়ানো এবং আপনার সন্তানের উপাদানগুলির যা প্রয়োজন তা আমদানি করুন। নীচে ধারণার একটি প্রমাণ দেওয়া হয়।

import React, { useState, useContext } from "react";
import ReactDOM from "react-dom";
import styles from "./styles.css";

// Create context container in a global scope so it can be visible by every component
const ContextContainer = React.createContext(null);

const initialAppState = {
  selected: "Nothing"
};

function App() {
  // The app has a state variable and update handler
  const [appState, updateAppState] = useState(initialAppState);

  return (
    <div>
      <h1>Passing state between components</h1>

      {/* 
          This is a context provider. We wrap in it any children that might want to access
          App's variables.
          In 'value' you can pass as many objects, functions as you want. 
           We wanna share appState and its handler with child components,           
       */}
      <ContextContainer.Provider value={{ appState, updateAppState }}>
        {/* Here we load some child components */}
        <Book title="GoT" price="10" />
        <DebugNotice />
      </ContextContainer.Provider>
    </div>
  );
}

// Child component Book
function Book(props) {
  // Inside the child component you can import whatever the context provider allows.
  // Earlier we passed value={{ appState, updateAppState }}
  // In this child we need the appState and the update handler
  const { appState, updateAppState } = useContext(ContextContainer);

  function handleCommentChange(e) {
    //Here on button click we call updateAppState as we would normally do in the App
    // It adds/updates comment property with input value to the appState
    updateAppState({ ...appState, comment: e.target.value });
  }

  return (
    <div className="book">
      <h2>{props.title}</h2>
      <p>${props.price}</p>
      <input
        type="text"
        //Controlled Component. Value is reverse vound the value of the variable in state
        value={appState.comment}
        onChange={handleCommentChange}
      />
      <br />
      <button
        type="button"
        // Here on button click we call updateAppState as we would normally do in the app
        onClick={() => updateAppState({ ...appState, selected: props.title })}
      >
        Select This Book
      </button>
    </div>
  );
}

// Just another child component
function DebugNotice() {
  // Inside the child component you can import whatever the context provider allows.
  // Earlier we passed value={{ appState, updateAppState }}
  // but in this child we only need the appState to display its value
  const { appState } = useContext(ContextContainer);

  /* Here we pretty print the current state of the appState  */
  return (
    <div className="state">
      <h2>appState</h2>
      <pre>{JSON.stringify(appState, null, 2)}</pre>
    </div>
  );
}

const rootElement = document.body;
ReactDOM.render(<App />, rootElement);

আপনি কোড স্যান্ডবক্স সম্পাদক এ উদাহরণ চালাতে পারেন।

প্রসঙ্গের সাথে-পাশের অবস্থা সম্পাদনা করুন


2

আমি অবাক হয়েছি যে আমি যে মুহুর্তে লিখছি সে মুহুর্তে একটি সরল আইডিয়োমেটিক প্রতিক্রিয়া সমাধানের সাথে কোনও উত্তর নেই। সুতরাং এখানে একটি (অন্যদের সাথে আকার এবং জটিলতার তুলনা করুন):

class P extends React.Component {
    state = { foo : "" };

    render(){
        const { foo } = this.state;

        return (
            <div>
                <C1 value={ foo } onChange={ x => this.setState({ foo : x })} />
                <C2 value={ foo } />
            </div>
        )
    }
}

const C1 = ({ value, onChange }) => (
    <input type="text"
           value={ value }
           onChange={ e => onChange( e.target.value ) } />
);

const C2 = ({ value }) => (
    <div>Reacting on value change: { value }</div>
);

আমি একটি শিশু উপাদান থেকে একটি পিতামত্তা উপাদান অবস্থা সেট করছি। এটি প্রতিক্রিয়াটির নকশার নীতিকে বিশ্বাসঘাতক বলে মনে হচ্ছে: একক-দিকের ডেটা প্রবাহ।

যে কোনও নিয়ন্ত্রিতinput (প্রতিক্রিয়া ফর্মের সাথে কাজ করার idiomatic উপায়) এর মধ্যে প্যারেন্ট রাষ্ট্র আপডেট করেonChange কলব্যাকের এবং এখনও কোনওরকম বিশ্বাসঘাতকতা করে না।

উদাহরণস্বরূপ, সি 1 উপাদানটি সাবধানতার সাথে দেখুন। কীভাবে C1এবং অন্তর্নির্মিত inputউপাদানটি রাষ্ট্রের পরিবর্তনগুলি পরিচালনা করে সেভাবে আপনি কোনও উল্লেখযোগ্য পার্থক্য দেখতে পান ? আপনার করা উচিত নয়, কারণ সেখানে কেউ নেই। রাজ্যটিকে উপরে তোলা এবং মান / অন চেঞ্জের জোড়গুলি কাটা কাঁচা প্রতিক্রিয়াটির জন্য মূর্তিমানিক। কিছু উত্তরের মতামত অনুসারে রেফ ব্যবহার নয়।


1
আপনি কোন সংস্করণের প্রতিক্রিয়া ব্যবহার করছেন? আমি পরীক্ষামূলক শ্রেণীর সম্পত্তি সংক্রান্ত সমস্যা পাচ্ছি এবং ফুও সংজ্ঞায়িত হয়নি।
আইজাক পাক

এটি প্রতিক্রিয়াটির কোনও সংস্করণ ছিল না। উপাদানটির কোডটি ভুল ছিল। এটি স্থির করে নিন, এখনই চেষ্টা করুন।
গেপটন

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

1
আমি এই সমাধানটি পছন্দ করি। যদি কেউ এটির সাথে টিঙ্কার করতে চান তবে আপনার জন্য এখানে একটি স্যান্ডবক্স
আইজাক পাক

2

উদাহরণ সহ আরও সাম্প্রতিক উত্তর, যা ব্যবহার করে React.useState

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

যখন রাজ্য প্যারেন্ট উপাদানগুলিতে থাকে তবে পিতা-মাতা যদি বাচ্চা valueএবং onChangeহ্যান্ডলারকে প্রপস দেয় (কখনও কখনও এটিকে মান লিঙ্ক বা রাষ্ট্রের লিঙ্কের প্যাটার্ন বলা হয় ) বাচ্চা এটিকে পরিবর্তন করতে পারে । আপনি এখানে হুক দিয়ে কীভাবে করবেন তা এখানে:


function Parent() {
    var [state, setState] = React.useState('initial input value');
    return <>
        <Child1 value={state} onChange={(v) => setState(v)} />
        <Child2 value={state}>
    </>
}

function Child1(props) {
    return <input
        value={props.value}
        onChange={e => props.onChange(e.target.value)}
    />
}

function Child2(props) {
    return <p>Content of the state {props.value}</p>
}

পুরো প্যারেন্ট উপাদানটি সন্তানের ইনপুট পরিবর্তনের জন্য পুনরায় রেন্ডার করবে, যা পিতামন্ডলের উপাদানটি ছোট / দ্রুত রেন্ডার করতে দ্রুত হয় তবে এটি কোনও সমস্যা নয়। প্যারেন্ট উপাদানগুলির পুনঃ-রেন্ডার কার্যকারিতা এখনও সাধারণ ক্ষেত্রে একটি সমস্যা হতে পারে (উদাহরণস্বরূপ বড় আকারগুলি)। এটি আপনার ক্ষেত্রে সমস্যার সমাধান হয় (নীচে দেখুন)।

রাষ্ট্রের লিঙ্কের ধরণ এবং কোনও পিতামাতার পুনঃ-রেন্ডার হুকস্টেটের মতো তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করে প্রয়োগ করা আরও সহজ - React.useStateআপনার ব্যবহারকারীর সহ বিভিন্ন ব্যবহারের কেস কভার করতে সুপারচার্জ করা। (অস্বীকৃতি: আমি প্রকল্পের একজন লেখক)।

হুকস্টেটের সাথে এটি দেখতে কেমন হবে তা এখানে। Child1ইনপুট পরিবর্তন করবে, Child2এতে প্রতিক্রিয়া জানাবে।Parentরাষ্ট্রকে ধরে রাখবে তবে কেবলমাত্র Child1এবং Child2হবে রাষ্ট্র পরিবর্তনকে পুনরায় রেন্ডার করবে না ।

import { useStateLink } from '@hookstate/core';

function Parent() {
    var state = useStateLink('initial input value');
    return <>
        <Child1 state={state} />
        <Child2 state={state}>
    </>
}

function Child1(props) {
    // to avoid parent re-render use local state,
    // could use `props.state` instead of `state` below instead
    var state = useStateLink(props.state)
    return <input
        value={state.get()}
        onChange={e => state.set(e.target.value)}
    />
}

function Child2(props) {
    // to avoid parent re-render use local state,
    // could use `props.state` instead of `state` below instead
    var state = useStateLink(props.state)
    return <p>Content of the state {state.get()}</p>
}

পিএস: এখানে আরও অনেক উদাহরণ রয়েছে যেমন গভীরভাবে নেস্টেড ডেটা, রাষ্ট্রীয় বৈধতা, setStateহুক সহ গ্লোবাল স্টেট ইত্যাদি অন্তর্ভুক্ত এবং আরও জটিল পরিস্থিতিগুলি জুড়ে রয়েছে এখানে অনলাইনে সম্পূর্ণ নমুনা প্রয়োগ রয়েছে , যা হুকস্টেট এবং উপরে বর্ণিত কৌশলটি ব্যবহার করে।


1

আপনার Redux এবং ReactRedux গ্রন্থাগারটি শিখতে হবে t এটি আপনার স্টেটগুলি এবং প্রপসগুলি একটি স্টোরে গঠন করবে এবং আপনি পরে সেগুলি আপনার উপাদানগুলিতে অ্যাক্সেস করতে পারবেন।


1

প্রতিক্রিয়া> = 16.3 এর সাহায্যে আপনি তার পিতামাতার কাছ থেকে সন্তানের ডিওমে অ্যাক্সেস পেতে রেফ এবং ফরোয়ার্ড রেফ ব্যবহার করতে পারেন। পুরানো উপায় রেফ ব্যবহার করবেন না।
এখানে আপনার কেস ব্যবহার করে উদাহরণ দেওয়া হল:

import React, { Component } from 'react';

export default class P extends React.Component {
   constructor (props) {
      super(props)
      this.state = {data: 'test' }
      this.onUpdate = this.onUpdate.bind(this)
      this.ref = React.createRef();
   }

   onUpdate(data) {
      this.setState({data : this.ref.current.value}) 
   }

   render () {
      return (
        <div>
           <C1 ref={this.ref} onUpdate={this.onUpdate}/>
           <C2 data={this.state.data}/>
        </div>
      )
   }
}

const C1 = React.forwardRef((props, ref) => (
    <div>
        <input type='text' ref={ref} onChange={props.onUpdate} />
    </div>
));

class C2 extends React.Component {
    render () {
       return <div>C2 reacts : {this.props.data}</div>
    }
}

দেখুন refs এবং ForwardRef refs এবং forwardRef বিষয়ে বিস্তারিত তথ্যের জন্য।


0
  1. করণীয় সঠিক জিনিস হ'ল অভিভাবক উপাদানটিতে রাষ্ট্র থাকা , রেফ এড়ানো এবং কী না
  2. একটি সমস্যা হ'ল ক্ষেত্রের মধ্যে টাইপ করার সময় সব শিশুকে নিয়মিত আপডেট করা এড়ানো
  3. অতএব, প্রতিটি সন্তানের একটি উপাদান হতে হবে (যেমন কোনও পিওর কম্পোনেন্ট নয়) বাস্তবায়ন করতে হবে shouldComponentUpdate(nextProps, nextState)
  4. এই পদ্ধতিতে, কোনও ফর্ম ফিল্ডে টাইপ করার সময় কেবলমাত্র সেই ক্ষেত্রটি আপডেট হয়

নীচের কোডটিতে ব্যাবেলজেএস 6 এবং শ্রেণি-বৈশিষ্ট্যগুলির ES.Next এর @boundটীকাগুলি ব্যবহার করা হয়েছে ( টীকাগুলি বাইন্ডের মতো সদস্য ফাংশনে এই মানটি সেট করে):babel-plugin-transform-decorators-legacy

/*
© 2017-present Harald Rudell <harald.rudell@gmail.com> (http://www.haraldrudell.com)
All rights reserved.
*/
import React, {Component} from 'react'
import {bound} from 'class-bind'

const m = 'Form'

export default class Parent extends Component {
  state = {one: 'One', two: 'Two'}

  @bound submit(e) {
    e.preventDefault()
    const values = {...this.state}
    console.log(`${m}.submit:`, values)
  }

  @bound fieldUpdate({name, value}) {
    this.setState({[name]: value})
  }

  render() {
    console.log(`${m}.render`)
    const {state, fieldUpdate, submit} = this
    const p = {fieldUpdate}
    return (
      <form onSubmit={submit}> {/* loop removed for clarity */}
        <Child name='one' value={state.one} {...p} />
        <Child name='two' value={state.two} {...p} />
        <input type="submit" />
      </form>
    )
  }
}

class Child extends Component {
  value = this.props.value

  @bound update(e) {
    const {value} = e.target
    const {name, fieldUpdate} = this.props
    fieldUpdate({name, value})
  }

  shouldComponentUpdate(nextProps) {
    const {value} = nextProps
    const doRender = value !== this.value
    if (doRender) this.value = value
    return doRender
  }

  render() {
    console.log(`Child${this.props.name}.render`)
    const {value} = this.props
    const p = {value}
    return <input {...p} onChange={this.update} />
  }
}

0

পিতামাতার কাছ থেকে সন্তানের কাছে ডেটা পাস করার ধারণাটি এবং এর বিপরীতে ব্যাখ্যা করা হয়।

import React, { Component } from "react";
import ReactDOM from "react-dom";

// taken refrence from https://gist.github.com/sebkouba/a5ac75153ef8d8827b98

//example to show how to send value between parent and child

//  props is the data which is passed to the child component from the parent component

class Parent extends Component {
  constructor(props) {
    super(props);

    this.state = {
      fieldVal: ""
    };
  }

  onUpdateParent = val => {
    this.setState({
      fieldVal: val
    });
  };

  render() {
    return (
      // To achieve the child-parent communication, we can send a function
      // as a Prop to the child component. This function should do whatever
      // it needs to in the component e.g change the state of some property.
      //we are passing the function onUpdateParent to the child
      <div>
        <h2>Parent</h2>
        Value in Parent Component State: {this.state.fieldVal}
        <br />
        <Child onUpdate={this.onUpdateParent} />
        <br />
        <OtherChild passedVal={this.state.fieldVal} />
      </div>
    );
  }
}

class Child extends Component {
  constructor(props) {
    super(props);

    this.state = {
      fieldValChild: ""
    };
  }

  updateValues = e => {
    console.log(e.target.value);
    this.props.onUpdate(e.target.value);
    // onUpdateParent would be passed here and would result
    // into onUpdateParent(e.target.value) as it will replace this.props.onUpdate
    //with itself.
    this.setState({ fieldValChild: e.target.value });
  };

  render() {
    return (
      <div>
        <h4>Child</h4>
        <input
          type="text"
          placeholder="type here"
          onChange={this.updateValues}
          value={this.state.fieldVal}
        />
      </div>
    );
  }
}

class OtherChild extends Component {
  render() {
    return (
      <div>
        <h4>OtherChild</h4>
        Value in OtherChild Props: {this.props.passedVal}
        <h5>
          the child can directly get the passed value from parent by this.props{" "}
        </h5>
      </div>
    );
  }
}

ReactDOM.render(<Parent />, document.getElementById("root"));


1
আমি আপনাকে পূর্বের উত্তর মালিককে তার উত্তরে প্রদত্ত বিবরণ যুক্ত করতে একটি মন্তব্য হিসাবে অবহিত করার পরামর্শ দিচ্ছি। সৌজন্যের জন্য আপনার নামটি পুনরায় উল্লেখ করার পরে।
থমাস ইজো

@ থমাস এশো আমি তাকে এখানে খুঁজে পাচ্ছি না, আমি এটি পরীক্ষা করেছিলাম। অন্য কোনও পরামর্শ আছে
অক্ষয়

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