প্রতিক্রিয়ায় উপাদানগুলির মধ্যে ফাংশনগুলি ভাগ করার সঠিক উপায়


90

আমার একাধিক উপাদান রয়েছে যা সকলকে একই জিনিস করা দরকার। (একটি সাধারণ ফাংশন যা তাদের সন্তানের উপাদানগুলির উপরে মানচিত্র তৈরি করে এবং প্রত্যেককে কিছু করে)। এই মুহুর্তে আমি প্রতিটি উপাদানটিতে এই পদ্ধতিটি সংজ্ঞায়িত করছি। তবে আমি এটি একবারই সংজ্ঞায়িত করতে চাই।

আমি এটি শীর্ষ স্তরের উপাদানটিতে সংজ্ঞায়িত করতে পারি এবং তারপরে এটিকে প্রপস হিসাবে পাস করতে পারি। তবে সেটা মোটেও ঠিক মনে হচ্ছে না। এটি প্রোপের চেয়ে একটি লাইব্রেরি ফাংশন। (এটা আমার মনে হচ্ছে).

এটি করার সঠিক উপায় কী?


পরীক্ষা করে দেখুন এই লিঙ্কে । অথবা গুগলে "মিশিনস" এবং "এইচওসি" অনুসন্ধান করুন।
বোরজ

উত্তর:


36

আপনি ভালো কিছু ব্যবহার করেন তাহলে browserify তারপর আপনি একটি বহিস্থিত ফাইল অর্থাত util.js যে রপ্তানির কিছু ইউটিলিটি ফাংশন থাকতে পারে।

var doSomething = function(num) {
 return num + 1;
}

exports.doSomething = doSomething;

তারপরে এটি প্রয়োজনীয় হিসাবে প্রয়োজন

var doSomething = require('./util.js').doSomething;

@ অঙ্কিতসিংহনিয়া এটি নির্ভর করে, আপনি আপনার অ্যাপের সামনের প্রান্তটি পরিচালনা করতে কী ব্যবহার করছেন?
ডিউক

4
আমি প্রতিক্রিয়া রাজ্য ব্যবহার করছি।
aks

আমি কেন 'ডোসোমিংথিং' পাচ্ছি তার কোনও ধারণা নেই?
অভিজিৎ চক্র

45

সর্বশেষ জাভাস্ক্রিপ্ট ES6 সিনট্যাক্স সহ Utils.js

Utils.jsএকাধিক ফাংশন ইত্যাদির সাহায্যে ফাইলটি তৈরি করুন

const someCommonValues = ['common', 'values'];

export const doSomethingWithInput = (theInput) => {
   //Do something with the input
   return theInput;
};

export const justAnAlert = () => {
   alert('hello');
};

তারপরে আপনার যে উপাদানগুলিতে আপনি ব্যবহারের ফাংশনগুলি ব্যবহার করতে চান সেগুলিতে প্রয়োজনীয় নির্দিষ্ট ফাংশন আমদানি করুন। আপনাকে সবকিছু আমদানি করতে হবে না

import {doSomethingWithInput, justAnAlert} from './path/to/utils.js/file'

এবং তারপরে উপাদানগুলির মধ্যে এই ফাংশনগুলি ব্যবহার করুন:

justAnAlert();
<p>{doSomethingWithInput('hello')}</p>

/fileআমদানি লাইনের শেষে কী ?
অ্যালেক্স

@ অ্যালেক্স এটি একটি উদাহরণ মাত্র। সেখানে util.js আপনার আপেক্ষিক পাথ রাখুন
Fangming

13

যদি আপনি সহায়তার কার্যগুলিতে রাষ্ট্রের কৌশলটি পরিচালনা করতে চান তবে এটি অনুসরণ করুন:

  1. একটি হেল্পার্স.জেএস ফাইল তৈরি করুন:

    export function myFunc(){ return this.state.name; //define it according to your needs }

  2. আপনার উপাদান ফাইলে সহায়তা ফাংশন আমদানি করুন:

    import {myFunc} from 'path-to/Helpers.js'

  3. আপনার কনস্ট্রাক্টরে ক্লাসে সেই সহায়ক ফাংশন যুক্ত করুন

    constructor(){ this.myFunc = myFunc.bind(this) }

  4. আপনার রেন্ডার ফাংশনে এটি ব্যবহার করুন:

    render(){ <div>{this.myFunc()}</div> }


10

আপনি কীভাবে FetchUtil.handleErrorএকটি প্রতিক্রিয়া উপাদান ( App) এর কোনও ফাংশন ( ) পুনরায় ব্যবহার করতে পারেন তার কয়েকটি উদাহরণ এখানে ।

সমাধান 1: কমনজেএস মডিউল সিনট্যাক্স ব্যবহার করে

module.exports = {
  handleError: function(response) {
    if (!response.ok) throw new Error(response.statusText);
    return response;
  },
};

সমাধান 2: "ক্রিয়েক্লাস" ব্যবহার করে (প্রতিক্রিয়া v16)

ব্যবহার / ফেচUtil.js

const createReactClass = require('create-react-class');

const FetchUtil = createReactClass({
  statics: {
    handleError: function(response) {
      if (!response.ok) throw new Error(response.statusText);
      return response;
    },
  },
  render() {
  },
});

export default FetchUtil;

দ্রষ্টব্য: আপনি যদি v15.4 (বা নীচে) প্রতিক্রিয়া ব্যবহার করে থাকেন তবে আপনাকে createClassনিম্নলিখিত হিসাবে আমদানি করতে হবে :

import React from 'react';
const FetchUtil = React.createClass({});

সূত্র: https://reactjs.org/blog/2017/04/07/react-v15.5.0.html#migrating-from-reactcreateclass

উপাদান (যা ফেচUtil পুনরায় ব্যবহার করে)

উপাদান / App.jsx

import Categories from './Categories.jsx';
import FetchUtil from '../utils/FetchUtil';
import Grid from 'material-ui/Grid';
import React from 'react';

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {categories: []};
  }

  componentWillMount() {
    window
      .fetch('/rest/service/v1/categories')
      .then(FetchUtil.handleError)
      .then(response => response.json())
      .then(categories => this.setState({...this.state, categories}));
  }

  render() {
    return (
      <Grid container={true} spacing={16}>
        <Grid item={true} xs={12}>
          <Categories categories={this.state.categories} />
        </Grid>
      </Grid>
    );
  }
}

export default App;

7

ব্যবহার ফাইল তৈরি করা ছাড়া আর একটি শক্ত বিকল্প হ'ল একটি withComponentMapper()মোড়ক তৈরির জন্য একটি উচ্চতর অর্ডার উপাদান ব্যবহার করা । এই উপাদানটি প্যারামিটার হিসাবে কোনও উপাদান গ্রহণ করবে এবং componentMapper()প্রপস হিসাবে ফাংশনটি দিয়ে এটি ফিরিয়ে দেবে।

এটি প্রতিক্রিয়া হিসাবে একটি ভাল অনুশীলন হিসাবে বিবেচিত হয়। আপনি কীভাবে এখানে এটি বিশদভাবে করবেন তা জানতে পারেন।


আমি কৌতূহল বোধ করি কেন যে প্রতিক্রিয়াটি কম্পোনেন্ট প্যাটার্নটি সাদৃশ্যযুক্ত বলে মনে হয় সেই উপাদানগুলির উত্তরাধিকারকে নিরুৎসাহিত করে?
workwise

@ বা উত্তরাধিকার ব্যবহারের অর্থ দুটি উপাদান
জ্যাক

4

কোনও ইউটিলিটি ফাংশনের মতো মনে হচ্ছে, সেক্ষেত্রে এটিকে আলাদা স্ট্যাটিক ইউটিলিটি মডিউলে কেন রাখবেন না?

অন্যথায় যদি বাবেলের মতো ট্রান্সপ্লেলার ব্যবহার করে আপনি এস 7 এর স্থির পদ্ধতি ব্যবহার করতে পারেন:

class MyComponent extends React.Component {
  static someMethod() { ...

অন্যথায় আপনি যদি React.createClass ব্যবহার করছেন তবে আপনি স্ট্যাটিক্স অবজেক্টটি ব্যবহার করতে পারেন :

var MyComponent = React.createClass({
  statics: {
    customMethod: function(foo) {
      return foo === 'bar';
    }
  }

তবে আমি এই বিকল্পগুলির পরামর্শ দিচ্ছি না, কোনও ইউটিলিটি পদ্ধতির জন্য কোনও উপাদান অন্তর্ভুক্ত করার কোনও মানে নেই।

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

ক্লাসটি প্রসারিত করার জন্য অন্য বিকল্পটি হ'ল মিক্সিন ব্যবহার করা, তবে আমি সুপারিশ করি না যেহেতু আপনি এস 6+ এ এটি করতে পারবেন না (এবং আমি এই ক্ষেত্রে কোনও উপকার দেখতে পাচ্ছি না)।


মিক্সিন সম্পর্কিত তথ্য দরকারী। এই ক্ষেত্রে আমি একটি লাইফসাইकल ইভেন্টে স্বয়ংক্রিয়ভাবে কিছু হওয়ার চেয়ে শর্তসাপেক্ষে ফাংশনটি ব্যবহার করতে চাই। তাই। আপনি যেহেতু একটি সরল পুরাতন ইউটিলিটি ফাংশনটি যাচ্ছেন তা হল।

4
দ্রষ্টব্য: React.createClass15.5.0 প্রতিক্রিয়া দেখানোর পরে অবহেলা করা হয়েছে। তৈরি-প্রতিক্রিয়া-অ্যাপ্লিকেশন create-react-classপরিবর্তে এনপিএম মডিউল ব্যবহারের পরামর্শ দেয় ।
অ্যালেক্স জনসন

আমি ওপি হিসাবে একই জিনিস করতে চাই কিন্তু আমি এখানে কিছুটা বিভ্রান্ত। আপনি তালিকাভুক্ত বিকল্পগুলির কোনওটিই সুপারিশ করবেন না। আপনি কি সুপারিশ করবেন?
kkuilla

আমি সহজেই ফাংশনটির জন্য একটি ফাইল তৈরি করতে পারি doSomething.js, যেমন একাধিক অনুরূপ "ইউটিলিটি" ফাংশনযুক্ত একটি ফাইল যেমন utils.jsআপনি যে ফাংশনগুলি ব্যবহার করতে হবে সেগুলি আমদানি করুন
ডমিনিক

4

আমি নীচে দুটি শৈলী প্রদর্শন করব এবং উপাদানগুলির যুক্তি একে অপরের সাথে কতটা যুক্ত তার উপর নির্ভর করে আপনি চয়ন করতে চান।

স্টাইল 1 - তুলনামূলকভাবে সম্পর্কিত উপাদানগুলি এর মধ্যে কলব্যাক রেফারেন্স সহ তৈরি করা যেতে পারে ./components/App.js...

<SomeItem
    ref={(instance) => {this.childA = instance}}
/>

<SomeOtherItem
    ref={(instance) => {this.childB = instance}}
/>

এবং তারপরে আপনি তাদের মাঝে ভাগ করে নেওয়া ফাংশনগুলি ব্যবহার করতে পারেন ...

this.childA.investigateComponent(this.childB);  // call childA function with childB as arg
this.childB.makeNotesOnComponent(this.childA);  // call childB function with childA as arg

স্টাইল 2 - util-টাইপ উপাদান যাবে নির্মিত এই মত, ./utils/time.js...

export const getTimeDifference = function (start, end) {
    // return difference between start and end
}

এবং তারপরে সেগুলিকে এভাবে ব্যবহার করা যেতে পারে ./components/App.js...

import React from 'react';
import {getTimeDifference} from './utils/time.js';

export default class App extends React.Component {
    someFunction() {
        console.log(getTimeDifference("19:00:00", "20:00:00"));
    }
}

কোনটি ব্যবহার করবেন?

যদি যুক্তি তুলনামূলকভাবে সম্পর্কিত হয় (তারা কেবল একই অ্যাপে একসাথে ব্যবহৃত হয়), তবে আপনার উপাদানগুলির মধ্যে রাজ্যগুলি ভাগ করা উচিত। তবে যদি আপনার যুক্তি দূর থেকে সম্পর্কিত (যেমন, গণিতের ব্যবহার, পাঠ্য-বিন্যাসের ব্যবহার) হয় তবে আপনার ব্যবহার শ্রেণীর ফাংশনগুলি তৈরি এবং আমদানি করা উচিত।


2

আপনি কি এই জন্য একটি মেশিন ব্যবহার করবেন না? Https://facebook.github.io/react/docs/reusable-components.html দেখুন

যদিও তারা অনুগ্রহের বাইরে চলে যাচ্ছে https://medium.com/@dan_abramov/mixins-are-dead-long-live-higher-order-components-94a0d2f9e750 দেখুন

দরকারী হতে পারে


আমি সম্মত হলাম যে এখানে একটি সাধারণ ফাংশন রফতানির চেয়ে মিক্সিনই এখানে একটি ভাল সমাধান।
তাও হুয়াং

@ টাওহুয়াং কিছু বিষয় বিবেচনা করতে হবে, 1. মিক্সিনগুলি ভবিষ্যতের প্রমাণ নয় এবং আধুনিক অ্যাপ্লিকেশনগুলিতে কম বেশি ব্যবহৃত হবে, ২. একটি রফতানি ফাংশন ব্যবহার করা আপনার কোড কাঠামোটিকে অজ্ঞেয় করে তোলে - আপনি অন্য কোনও জেএস প্রকল্পে সেই ফাংশনটি সহজেই ব্যবহার করতে পারবেন। এছাড়াও মিক্সিনগুলি -> ফেসবুক.
দেওক

একটি মিশ্রিন রাষ্ট্রের অ্যাক্সেস এবং সংশোধন করতে পারে, যদিও কোনও বৈশিষ্ট্য তা না করে এবং ওপি যেহেতু বলছে যে তারা কোনও ফাংশন লাইব্রেরি হিসাবে বিবেচনা করার জন্য কিছু চায়, তাই মিক্সিন সঠিক সমাধান হতে পারে না।
হোল্ডঅফহাঙ্গার

এটি আপডেট করতে, উচ্চতর অর্ডার ফাংশনগুলি ব্যবহার করুন। ফেসবুক.
github.io/react/docs/higher-order-compাংশ.html

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