আমি কীভাবে শর্তসাপেক্ষে একটি প্রতিক্রিয়া উপাদানটি মোড়ানো করব?


90

আমার একটি উপাদান রয়েছে যা কখনও কখনও একটি হিসাবে <anchor>এবং অন্যান্য সময় হিসাবে রেন্ডার করা প্রয়োজন <div>propআমি এই নির্ধারণ পড়া হয় this.props.url

যদি এটি বিদ্যমান থাকে তবে আমাকে একটিতে আবৃত উপাদানটি রেন্ডার করতে হবে <a href={this.props.url}>। অন্যথায় এটি কেবল একটি হিসাবে রেন্ডার হয় <div/>

সম্ভব?

আমি এই মুহূর্তে এটি করছি, তবে এটি সহজ করা যেতে পারে বলে মনে করেন:

if (this.props.link) {
    return (
        <a href={this.props.link}>
            <i>
                {this.props.count}
            </i>
        </a>
    );
}

return (
    <i className={styles.Icon}>
        {this.props.count}
    </i>
);

হালনাগাদ:

এখানে চূড়ান্ত লকআপ রয়েছে। টিপটির জন্য ধন্যবাদ, @ সুলতান !

import React, { Component, PropTypes } from 'react';
import classNames from 'classnames';

export default class CommentCount extends Component {

    static propTypes = {
        count: PropTypes.number.isRequired,
        link: PropTypes.string,
        className: PropTypes.string
    }

    render() {
        const styles = require('./CommentCount.css');
        const {link, className, count} = this.props;

        const iconClasses = classNames({
            [styles.Icon]: true,
            [className]: !link && className
        });

        const Icon = (
            <i className={iconClasses}>
                {count}
            </i>
        );

        if (link) {
            const baseClasses = classNames({
                [styles.Base]: true,
                [className]: className
            });

            return (
                <a href={link} className={baseClasses}>
                    {Icon}
                </a>
            );
        }

        return Icon;
    }
}

আপনি const baseClasses =সেই if (this.props.link)শাখায়ও যেতে পারেন । আপনি ES6 ব্যবহার করছেন, তোমরাও তেমনি দ্বারা একটি বিট প্রক্রিয়া সহজ পারেন const {link, className} = this.props;এবং তারপর ব্যবহার linkএবং classNameস্থানীয় ভেরিয়েবল হিসেবে।
সুলতান

মানুষ, আমি এটা ভালবাসি। ES6 সম্পর্কে আরও বেশি করে শেখা এবং এটি সর্বদা কেবল পঠনযোগ্যতার উন্নতি করে। অতিরিক্ত টিপ জন্য ধন্যবাদ!
ব্র্যান্ডন ডারহাম

4
একটি "চূড়ান্ত লকআপ" কি?
ক্রিস হ্যারিসন

উত্তর:


94

শুধু একটি পরিবর্তনশীল ব্যবহার করুন।

var component = (
    <i className={styles.Icon}>
       {this.props.count}
    </i>
);

if (this.props.link) {
    return (
        <a href={this.props.link} className={baseClasses}>
            {component}
        </a>
    );
}

return component;

বা, আপনি বিষয়বস্তু রেন্ডার করতে একটি সহায়ক ফাংশন ব্যবহার করতে পারেন। জেএসএক্স হল অন্য যে কোনও কোড। আপনি যদি সদৃশ হ্রাস করতে চান তবে ফাংশন এবং ভেরিয়েবল ব্যবহার করুন।


23

আপনার উপাদান মোড়ানো জন্য একটি এইচওসি (উচ্চতর অর্ডার উপাদান) তৈরি করুন:

const WithLink = ({ link, className, children }) => (link ?
  <a href={link} className={className}>
    {children}
  </a>
  : children
);

return (
  <WithLink link={this.props.link} className={baseClasses}>
    <i className={styles.Icon}>
      {this.props.count}
    </i>
  </WithLink>
);

4
এইচওসি আস্তে আস্তে মারা যেতে হবে: পি
জেমি হাটার

শব্দটি HOCঘৃণ্য। এটি নিছক একটি ফাংশন যা মাঝখানে স্থাপন করা হয়েছে। আমি সত্যিই এই হঠাৎ ট্রেন্ডি নামটি "এইচপিসি" স্থানচ্যুত করছি। দশকের দশক ধরে পুরানো ধারণার মধ্যে রাখা একটি সাধারণ ফাংশন সম্পর্কে কী উচ্চ-আদেশ রয়েছে।
vsync

13

আমি যে সহায়ক উপাদানটি দেখেছি তার উদাহরণ এখানে দেওয়া হয়েছে (এটি নিশ্চিত নয় যে এটিকে স্বীকৃতি দেবে) যা কাজটি করে:

const ConditionalWrap = ({ condition, wrap, children }) => (
  condition ? wrap(children) : children
);

ব্যবহারের ক্ষেত্রে:

<ConditionalWrap condition={someCondition}
  wrap={children => (<a>{children}</a>)} // Can be anything
>
  This text is passed as the children arg to the wrap prop
</ConditionalWrap>

4
ক্রেডিট সম্ভবত এখানে যেতে হবে: gist.github.com/kitze/23d82bb9eb0baabfd03a6a720b1d637f
রায় প্রিন্স

আমি কিটজি থেকে দেখেছি। তবে আমি নিশ্চিত নই যে তিনি অন্য কারও কাছ থেকে ধারণাটি পেয়েছিলেন
এন্টনি

আমিই নই। পপ আপ হওয়া এটিই প্রথম ফলাফল এবং আমি এটি উত্স হিসাবে ধরে নিয়েছিলাম - বা কমপক্ষে এটির কাছাকাছি এসেছি;)।
রায় প্রিন্স

wrapজিনিসগুলিকে আরও "প্রতিক্রিয়া" রাখার জন্য আপনাকে কোনও ক্রিয়াকলাপ হিসাবে না হিসাবে ঘোষণামূলকভাবে ব্যবহার করা উচিত
স্পরিট

আপনি কীভাবে এটি আরও ঘোষিত @vsync করবেন? আমি ভেবেছিলাম রেন্ডার প্রপসগুলি প্রতিক্রিয়ার আত্মার মধ্যে ছিল?
অ্যান্টনি

10

আপনি একটি রেফারেন্স ভেরিয়েবল ব্যবহার করতে পারেন এমন আরও একটি উপায় রয়েছে

let Wrapper = React.Fragment //fallback in case you dont want to wrap your components

if(someCondition) {
    Wrapper = ParentComponent
}

return (
    <Wrapper parentProps={parentProps}>
        <Child></Child>
    </Wrapper>

)

তোমার প্রথমার্ধে ঘনীভূত করতেlet Wrapper = someCondition ? ParentComponent : React.Fragment
mpoisot

এটি দুর্দান্ত, তবে কখনও কখনও আপনি কোডটি ঘোষণামূলক রাখতে চান , যার অর্থ এটি কেবল জেএসএক্স ফেরায়
vsync

আমি একটি ত্রুটি React.Fragment can only have 'key' and 'children' পেয়েছি কারণ আমি "< র্যাপার >" "ক্লাসের নাম" এর মতো কিছু প্রপস পাস করেছি এবং তাই
ভিসিএনসি

@vsync আপনার প্রপসের জন্য একটি শর্ত পাশাপাশি প্রোডআইডি = {কিছু শর্ত যুক্ত করতে হবে? প্যারেন্টপ্রোপস: অপরিজ্ঞাত} ..
অবিনাশ

4
আমি জানি :) আমি এই সমস্যাটি নিয়ে এখানে আসা অন্যদের জন্য ডকুমেন্টের খাতিরে এটি লিখছিলাম, সুতরাং গুগল এই কীওয়ার্ডগুলির জন্য অনুসন্ধানের ফলাফলগুলিতে এই পৃষ্ঠাটি ক্যাশে করবে
vsync

1

আপনি এটির মতো একটি ব্যবহার ফাংশনও ব্যবহার করতে পারেন:

const wrapIf = (conditions, content, wrapper) => conditions
        ? React.cloneElement(wrapper, {}, content)
        : content;

1
const ConditionalWrapper = ({ condition, wrapper, children }) => 
  condition ? wrapper(children) : children;

আপনি যে উপাদানটি মোড়ানো চান

<ConditionalWrapper
   condition={link}
   wrapper={children => <a href={link}>{children}</a>}>
   <h2>{brand}</h2>
</ConditionalWrapper>

সম্ভবত এই নিবন্ধটি আপনাকে আরও সহায়তা করতে পারে https://blog.hackages.io/conditionally-wrap-an-element-in-react-a8b9a47fab2


0

যদি 'অন্য হিসাবে বর্ণনা আপনি একটি JSX ব্যবহার করা উচিত এখানে । এর মতো কিছু কাজ করা উচিত।

App = React.creatClass({
    render() {
        var myComponent;
        if(typeof(this.props.url) != 'undefined') {
            myComponent = <myLink url=this.props.url>;
        }
        else {
            myComponent = <myDiv>;
        }
        return (
            <div>
                {myComponent}
            </div>
        )
    }
});

-2

একটি কার্যকরী উপাদান যা 2 টি উপাদান সরবরাহ করে, একটি মোড়ানো এবং অন্যটি নয়।

পদ্ধতি 1:

// The interesting part:
const WrapIf = ({ condition, With, children, ...rest }) => 
  condition 
    ? <With {...rest}>{children}</With> 
    : children

 
    
const Wrapper = ({children, ...rest}) => <h1 {...rest}>{children}</h1>


// demo app: with & without a wrapper
const App = () => [
  <WrapIf condition={true} With={Wrapper} style={{color:"red"}}>
    foo
  </WrapIf>
  ,
  <WrapIf condition={false} With={Wrapper}>
    bar
  </WrapIf>
]

ReactDOM.render(<App/>, document.body)
<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>

এটি এর মতোও ব্যবহার করা যেতে পারে:

<WrapIf condition={true} With={"h1"}>

পদ্ধতি 2:

// The interesting part:
const Wrapper = ({ condition, children, ...props }) => condition 
  ? <h1 {...props}>{children}</h1>
  : <React.Fragment>{children}</React.Fragment>;   
    // stackoverflow prevents using <></>
  

// demo app: with & without a wrapper
const App = () => [
  <Wrapper condition={true} style={{color:"red"}}>
    foo
  </Wrapper>
  ,
  <Wrapper condition={false}>
    bar
  </Wrapper>
]

ReactDOM.render(<App/>, document.body)
<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>

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