প্রতিক্রিয়া উপাদানটির মধ্যে কীভাবে সুইচ স্টেটমেন্ট ব্যবহার করবেন?


110

আমার একটি প্রতিক্রিয়া উপাদান রয়েছে, এবং উপাদানটির renderপদ্ধতির ভিতরে আমার এই জাতীয় কিছু রয়েছে:

render() {
    return (
        <div>
            <div>
                // removed for brevity
            </div>

           { switch(...) {} }

            <div>
                // removed for brevity
            </div>
        </div>
    );
}

এখন মুল বক্তব্যটি হ'ল আমার দুটি divউপাদান রয়েছে, একটি শীর্ষে এবং নীচে একটি, যা স্থির। মাঝখানে আমি একটি স্যুইচ স্টেটমেন্ট চাই এবং আমার রাজ্যের মান অনুসারে আমি একটি আলাদা উপাদান রেন্ডার করতে চাই। সুতরাং মূলত, আমি চাই দুটি divউপাদান সর্বদা স্থির হয় এবং মাঝখানে কেবল প্রতিটি সময় একটি আলাদা উপাদান রেন্ডার করা হয়। আমি একাধিক-পদক্ষেপ প্রদানের প্রক্রিয়াটি প্রয়োগ করতে এটি ব্যবহার করছি)। যদিও কোডটি বর্তমানে এটি কাজ করে না, এটি আমাকে একটি ত্রুটি দেয় switchযা অপ্রত্যাশিত। কোন ধারণা কীভাবে আমি চাই তা অর্জন করতে পারি?


4
ঠিক আছে, আপনার কাছে returnবিবৃতিতে বা এমনকি সেই renderপদ্ধতির পদ্ধতিতে সমস্ত যুক্তি থাকা দরকার নেই । আপনি প্রতিটি সংজ্ঞায়িত গেল <div>একটি const যেমন, এবং তারপর ব্যবহার switch করার আগে আপনার returnযা নির্ধারণ <div>রেন্ডার করা উচিত?
জারেড গোগুয়েন

@ জারেডগোগুয়েন তবে তারপরে, আমার divউপরের এবং নীচে, প্রতিটি ক্ষেত্রে একাধিকবার পুনরাবৃত্তি করতে হবে switch। অথবা আমি কেবল ভুল বুঝেছি, আপনি ..
5:58

না, আপনি কোডটি তৈরি করতে let middleDiv = ...এবং তারপরে আপনি যে হার্ড কোডিং করেছেন সেখানে {middleDiv}দুটির মধ্যে আপনার রিটার্নে জেএসএক্স অন্তর্ভুক্ত <div>করতে পারেন।
জারেড গোগুয়েন

উত্তর:


200

এটিও চেষ্টা করুন, এটিও পরিষ্কার উপায়: কোনও ফাংশনে রেন্ডারটি থেকে স্যুইচ করুন এবং কেবল আপনার পছন্দসই প্যারামগুলি পাস করার জন্য এটি কল করুন। উদাহরণ স্বরূপ:

renderSwitch(param) {
  switch(param) {
    case 'foo':
      return 'bar';
    default:
      return 'foo';
  }
}

render() {
  return (
    <div>
      <div>
          // removed for brevity
      </div>
      {this.renderSwitch(param)}
      <div>
          // removed for brevity
      </div>
    </div>
  );
}


94

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

render () {
  return (
    <div>
      <div>
        {/* removed for brevity */}
      </div>
      {
        {
          'foo': <Foo />,
          'bar': <Bar />
        }[param]
      }
      <div>
        {/* removed for brevity */}
      </div>
    </div>
  )
}

4
এটি বেশ দুর্দান্ত। আমি এটি POJO এর পরিবর্তে অ্যারে ব্যবহার করতে কিছুটা সংশোধন করেছি এবং অ্যারেতে বন্ধনীটি করতে আমি কেবল সূচকটি ব্যবহার করছি।
নিকোলাস জেনেটেল

4
এটি পাইথনের সুইচ-কেস পরিচালনা করার মানক উপায়। আমি এই উদাহরণে এটি আরও ভাল তার উচ্চতর পাঠযোগ্যতার কারণে পছন্দ করি।
আমি আমার হাট

12
এই পদ্ধতির সীমা এবং ওভারহেড রয়েছে। আপনার প্রতিটি মতামত প্রক্রিয়া করা হবে এবং বর্তমান অবস্থা / প্রপসের উপর নির্ভর করবে যা সম্ভবত অস্তিত্বহীন। প্রাক্তন: ধরুন যে আপনি হয় রেন্ডার করতে চেয়েছিলেন: <SearchResults />বা <NoResults />। তাহলে দৃশ্য রাষ্ট্র রেন্ডার করা উচিত <NoResults />, <SearchResults />কম্পাইল না কারণ এটি বৈশিষ্ট্য যে এখনো উপস্থিত না থাকার উপর নির্ভর করে।
ABCD.ca

4
ডিফল্ট মামলার কী হবে?
কুংফুমন

4
@ lama12345 ডিফল্ট মামলার জন্য, ||নিম্নলিখিত হিসাবে ব্যবহার করুন :{ 'foo': <Foo />, 'bar': <Bar /> }[param] || <Baz />
হারুন অ্যাড্রিয়ান

54

এটি ঘটছে, কারণ switchবিবৃতিটি একটি statement, তবে এখানে জাভাস্ক্রিপ্ট একটি অভিব্যক্তি প্রত্যাশা করে।

যদিও, কোনও renderপদ্ধতিতে স্যুইচ স্টেটমেন্ট ব্যবহার করার পরামর্শ দেওয়া হয়নি , আপনি এটি অর্জন করতে স্ব-আমন্ত্রণমূলক ফাংশনটি ব্যবহার করতে পারেন:

render() {
    // Don't forget to return a value in a switch statement
    return (
        <div>
            {(() => {
                switch(...) {}
            })()}
        </div>
    );
}

ধন্যবাদ আমি এর মতো ব্যবহার করেছি: রেন্ডার () {রিটার্ন (<ডিভিটি> {(()) => {সুইচ (this.state.type) {কেস কমন্স। {this.onSubmit} />;}}) ()} </div>);
JhonQO

22

আমি এটি রেন্ডার () পদ্ধতির অভ্যন্তরে করেছি:

  render() {
    const project = () => {
      switch(this.projectName) {

        case "one":   return <ComponentA />;
        case "two":   return <ComponentB />;
        case "three": return <ComponentC />;
        case "four":  return <ComponentD />;

        default:      return <h1>No project match</h1>
      }
    }

    return (
      <div>{ project() }</div>
    )
  }

আমি রেন্ডার () রিটার্নটি পরিষ্কার রাখার চেষ্টা করেছি, তাই আমি আমার যুক্তিটি ঠিক উপরে 'কনস্ট' ফাংশনে রেখেছি। এইভাবে আমি আমার স্যুইচ কেসগুলি খুব সুন্দরভাবে ইনডেন্ট করতে পারি।


@ এ_ম_দেব রেন্ডার পদ্ধতির অভ্যন্তরে কোনও 'কনস্ট্রাক্ট প্রকল্প' ফাংশনের পরিবর্তে, আমরা এটিকে একটি উপাদান পদ্ধতি হিসাবে রাখতে পারি, তারপরে "<div> {this.project ()} </div>" রেন্ডার রিটার্নের অভ্যন্তরে কল করতে পারি। আপনি যদি একেবারে স্যুইচ ব্যবহার না করার কথা বলছেন তবে আমি / / অন্যটি ব্যবহার করার কথা ভাবতে পারি, বা স্টেট আপডেট করে ক্লাসনেম ব্যবহার করে উপাদানগুলি দেখিয়ে / আড়াল করি।
উইলিয়ামসি

এটি আরও ভাল হতে পারে, কারণ উদাহরণ হিসাবে আমি আমার নথির head()react-helmet
শিরোনামে

15

লঙ্কানের উত্তর একটি দুর্দান্ত সমাধান।

<div>
  {{ beep: <div>Beep</div>,
     boop: <div>Boop</div>
  }[greeting]}
</div>

আপনার যদি কোনও ডিফল্ট মান প্রয়োজন হয় তবে আপনি এটি করতেও পারেন

<div>
  {{ beep: <div>Beep</div>,
     boop: <div>Boop</div>
  }[greeting] || <div>Hello world</div>}
</div>

বিকল্পভাবে, যদি এটি আপনার কাছে ভাল না পড়ে তবে আপনি এর মতো কিছু করতে পারেন

<div>
  { 
    rswitch(greeting, {
      beep: <div>Beep</div>,
      boop: <div>Boop</div>,
      default: <div>Hello world</div>
    }) 
  }
</div>

সঙ্গে

function rswitch (param, cases) {
  if (cases[param]) {
    return cases[param]
  } else {
    return cases.default
  }
}

4
। {কী 1: <উপাদান 1 />, ...} [কী] ভাল সমাধান নয়। আপনি দেখুন, নির্বাচনটি হওয়ার আগে পুরো প্রাথমিক অবজেক্টটি তৈরি করা হয় - যেমন স্যুইচের প্রতিটি শাখা রেন্ডার করা হয় - কম্পোনেন্ট 1, কম্পোনেন্ট 2, ইত্যাদি ...
গ্লেব ভারেনভ

হ্যাঁ, লেঙ্কনের উত্তরটি সঠিক উত্তর হওয়া উচিত, কারণ কার্যকরী উপাদানগুলিতে স্যুইচ ব্যবহার করা উচিত নয়। ওআর ডিফল্ট ক্ষেত্রে যোগ করার জন্য ধন্যবাদ । আর আরএসভিচ () নিয়ে বিরক্ত করবেন না, মানচিত্রের সমাধানটি স্পট! থাম্বস আপ
ইউজিনিউজ এস এস

15

শর্তসাপেক্ষ অপারেটর ব্যবহার করে রেন্ডার ব্লকে এক ধরণের সুইচ উপস্থাপন করার একটি উপায় :

{(someVar === 1 &&
    <SomeContent/>)
|| (someVar === 2 &&
    <SomeOtherContent />)
|| (this.props.someProp === "something" &&
    <YetSomeOtherContent />)
|| (this.props.someProp === "foo" && this.props.someOtherProp === "bar" &&
    <OtherContentAgain />)
||
    <SomeDefaultContent />
}

এটি নিশ্চিত করা উচিত যে শর্তগুলি কঠোরভাবে একটি বুলিয়ান ফিরিয়ে দেয়।


4
সুন্দর এবং মার্জিত এবং রেন্ডার ব্লকে সরাসরি ব্যবহার করা যেতে পারে। সেরা উত্তর আইএমএইচও
গ্যাভিনবেলসন

4
আমি লক্ষ্য করেছি যে এটি EsLint বিধি লঙ্ঘন eslint.org/docs/rules/no-mixed-operators মিশ্রণ && এবং ||
ফিশফিনজাররা

4
@ ফিশফিনজাররা যখন আমি ওপরের মতো ঠিক এটি ব্যবহার করার চেষ্টা করেছি তখনও আমি তা লক্ষ্য করেছি। প্রতিটি "কেস" কে প্রথম বন্ধনে আবৃত করে সহজেই এড়ানো যায়।
Ch0sen

13

আমি বর্তমানের উত্তরগুলির কোনওরও বড় অনুরাগী নই, কারণ সেগুলি হয় খুব ভার্জোজ, বা কী চলছে তা বোঝার জন্য আপনার কোডের চারপাশে ঝাঁপিয়ে পড়ার প্রয়োজন।

আমি এটি তৈরি করে আরও বেশি উপাদান কেন্দ্রিক উপায়ে প্রতিক্রিয়া জানাতে পছন্দ করি <Switch/>। এই উপাদানটির কাজটি একটি প্রপ নেওয়া এবং কেবল তাদের বাচ্চাদের রেন্ডার করা উচিত যাদের সন্তানের প্রপ এই সাথে মেলে। সুতরাং নীচের উদাহরণে আমি testস্যুইচটিতে একটি প্রপ তৈরি করেছি , এবং এটি valueবাচ্চাদের একটি উত্সের সাথে তুলনা করেছি , কেবল এটির সাথে মিলেছে।

উদাহরণ:

const Switch = props => {
  const { test, children } = props
  // filter out only children with a matching prop
  return children.find(child => {
    return child.props.value === test
  })      
}

const Sample = props => {
  const someTest = true
  return (
    <Switch test={someTest}>
      <div value={false}>Will display if someTest is false</div>
      <div value={true}>Will display if someTest is true</div>
    </Switch>
  )
}

ReactDOM.render(
  <Sample/>,
  document.getElementById("react")
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="react"></div>

আপনি স্যুইচটিকে যতটা সহজ বা আপনার পছন্দ মতো জটিল করতে পারেন। বাচ্চাদের এবং তাদের মান প্রপসগুলির আরও দৃ prop় চেকিং করতে ভুলবেন না।


4
ঠিক আমি খুঁজছেন ছিল কি! এখানে একটি সামান্য উন্নতি: javascript const Switch = props => { const { test, children } = props; return children.find(child => { return child.props.value === test; }); }; const Case = ({ children, value }) => { return children; // I don't want do add container around my cases ! }; এইভাবে আপনি লিখতে পারেন:javascript <Switch test={true}> <Case value={true}> <ItAlwaysFeelsRightToBeTrue /> </Case> <Case value={false}> <FalseAlarm /> </Case> </Switch>
lsmod

যদিও এটি একটি ভাল সমাধান,
কোডটিতে

@ পেপিজি কিছুটা আরও বিশদ সহ আপডেট হয়েছে।
ম্যাট ওয়ে

@ ম্যাটওয়ে যদিও খাঁটি জেএসের জন্য এটি একটি ভাল বিকল্প, এটিএসএস ত্রুটি ছুঁড়েছে যখন লক্ষ্য এসএস-তে নির্ধারণ করা হয়েছে কারণ রিয়েলটনোডে সম্পত্তি অনুসন্ধানের অস্তিত্ব নেই
জাকরিয়া বিলাল

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

3

কেমন:

mySwitchFunction = (param) => {
   switch (param) {
      case 'A':
         return ([
            <div />,
         ]);
      // etc...
   }
}
render() {
    return (
       <div>
          <div>
               // removed for brevity
          </div>

          { this.mySwitchFunction(param) }

          <div>
              // removed for brevity
          </div>
      </div>
   );
}

2

আপনি এরকম কিছু করতে পারেন।

 <div>
          { object.map((item, index) => this.getComponent(item, index)) }
 </div>

getComponent(item, index) {
    switch (item.type) {
      case '1':
        return <Comp1/>
      case '2':
        return <Comp2/>
      case '3':
        return <Comp3 />
    }
  }

2

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

এটি করার জন্য একটি দুর্দান্ত পরিষ্কার উপায় এখানে প্রতিটি ভিউ আগেই রেন্ডার করার প্রয়োজন হয় না:

render () {
  const viewState = this.getViewState();

  return (
    <div>
      {viewState === ViewState.NO_RESULTS && this.renderNoResults()}
      {viewState === ViewState.LIST_RESULTS && this.renderResults()}
      {viewState === ViewState.SUCCESS_DONE && this.renderCompleted()}
    </div>
  )

যদি আপনার শর্তগুলির জন্য দর্শন রাজ্য কোনও সরল সম্পত্তির উপর ভিত্তি করে - যেমন প্রতি লাইনের একাধিক শর্ত, তবে getViewStateশর্তাবলী যুক্তিকে আলাদা করতে এবং আপনার রেন্ডারটিকে সাফ করার জন্য একটি এনাম এবং শর্তগুলি আবশ্যক করে ফাংশন।


সহজ এবং পরিষ্কার উপায়।
অভিলেখ সিংহ

2

উপাদানগুলির মধ্যে স্যুইচ করতে বোতামটি ব্যবহার করে এখানে একটি সম্পূর্ণ কার্যকারী উদাহরণ

আপনি নিম্নলিখিত হিসাবে একটি নির্মাতা সেট করতে পারেন

constructor(props)
{
    super(props);
    this.state={
        currentView: ''
    }
}

তারপরে আপনি নিম্নলিখিত হিসাবে উপাদানগুলি রেন্ডার করতে পারেন

  render() 
{
    const switchView = () => {

    switch(this.state.currentView) 
    {

      case "settings":   return <h2>settings</h2>;
      case "dashboard":   return <h2>dashboard</h2>;

      default:      return <h2>dashboard</h2>
    }
  }

    return (

       <div>

            <button onClick={(e) => this.setState({currentView: "settings"})}>settings</button>
            <button onClick={(e) => this.setState({currentView: "dashboard"})}>dashboard</button>

            <div className="container">
                { switchView() }
            </div>


        </div>
    );
}

}

আপনি দেখতে পাচ্ছেন যে আমি রাষ্ট্রগুলির মধ্যে স্যুইচ করতে একটি বোতাম ব্যবহার করছি।


1

আমি https://stackoverflow.com/a/60313570/770134 এ পরামর্শটি সত্যিই পছন্দ করেছি , তাই আমি এটিকে টাইপসক্রিপ্টে এর মতো করে ফেলেছি

import React, { FunctionComponent } from 'react'
import { Optional } from "typescript-optional";
const { ofNullable } = Optional

interface SwitchProps {
  test: string
  defaultComponent: JSX.Element
}

export const Switch: FunctionComponent<SwitchProps> = (props) => {
  return ofNullable(props.children)
    .map((children) => {
      return ofNullable((children as JSX.Element[]).find((child) => child.props['value'] === props.test))
        .orElse(props.defaultComponent)
    })
    .orElseThrow(() => new Error('Children are required for a switch component'))
}

const Foo = ({ value = "foo" }) => <div>foo</div>;
const Bar = ({ value = "bar" }) => <div>bar</div>;
const value = "foo";
const SwitchExample = <Switch test={value} defaultComponent={<div />}>
  <Foo />
  <Bar />
</Switch>;

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