गतिशीलভাবে প্রতিক্রিয়াতে শিশু উপাদান যুক্ত করুন components


89

আমার লক্ষ্য হ'ল একটি পৃষ্ঠা / প্যারেন্ট উপাদানগুলিতে গতিশীল উপাদানগুলি যুক্ত করা।

আমি এর মতো কয়েকটি বেসিক উদাহরণ টেম্পলেট দিয়ে শুরু করেছি:

main.js:

var App = require('./App.js');
var SampleComponent = require('./SampleComponent.js');
ReactDOM.render(<App/>, document.body);
ReactDOM.render(<SampleComponent name="SomeName"/>, document.getElementById('myId'));

App.js:

var App = React.createClass({
    render: function() {
        return (
            <div>
                <h1>App main component! </h1>
                <div id="myId">myId div</div>
            </div>

        );
    }

});

নমুনা কম্পোনেন্ট.জেএস:

var SampleComponent = React.createClass({
    render: function() {
        return (
            <div>
                <h1>Sample Component! </h1>
            </div>
        );
    }
});

এখানে নোডে SampleComponentমাউন্ট করা হয়েছে <div id="myId"></div>যা App.jsটেমপ্লেটে প্রাক-লিখিত আছে । তবে যদি আমাকে অ্যাপ উপাদানটিতে অনির্দিষ্টকালের উপাদান যুক্ত করার দরকার হয় তবে কী হবে? স্পষ্টতই আমি সেখানে সমস্ত প্রয়োজনীয় ডিভগুলি বসতে পারি না।

কিছু টিউটোরিয়াল পড়ার পরেও কীভাবে উপাদানগুলি প্যারেন্ট উপাদানগুলিতে গতিশীলভাবে তৈরি করা হয় এবং যুক্ত করা হয় তা সম্পর্কে আমার এখনও কোনও বোঝাপড়া নেই। এটি করার একটি উপায় কী?


4
আপনার উভয় উপাদানই বিভিন্ন উপাদানগুলিতে মাউন্ট হওয়ার কারণ রয়েছে? প্রতিক্রিয়াশীল অ্যাপগুলির 99% কেবল ReactDOM.renderএকবার কল করে এবং অন্যান্য সমস্ত উপাদানগুলি 'রুট' নোডের শিশু
আজিয়াম

4
না, আমি এখন বুঝতে পারি এটি সঠিক উপায় নয় :)
জাস্টিন ট্রেভেইন

উত্তর:


70

আপনার শিশুদের মতো আপনার উপাদানগুলি এইভাবে পাস করতে হবে:

var App = require('./App.js');
var SampleComponent = require('./SampleComponent.js');
ReactDOM.render(
    <App>
        <SampleComponent name="SomeName"/> 
    <App>, 
    document.body
);

এবং তারপরে উপাদানগুলির শরীরে এগুলি যুক্ত করুন:

var App = React.createClass({
    render: function() {
        return (
            <div>
                <h1>App main component! </h1>
                {
                    this.props.children
                }
            </div>
        );
    }
});

আপনাকে ম্যানুয়ালি এইচটিএমএল কোড ম্যানিপুলেট করার দরকার নেই, প্রতিক্রিয়া আপনার জন্য এটি করবে। আপনি যদি কিছু সন্তানের উপাদান যুক্ত করতে চান তবে আপনার কেবল প্রপস পরিবর্তন করতে হবে বা এটি নির্ভর করে তা উল্লেখ করতে হবে। উদাহরণ স্বরূপ:

var App = React.createClass({

    getInitialState: function(){
        return [
            {id:1,name:"Some Name"}
        ]
    },

    addChild: function() {
        // State change will cause component re-render
        this.setState(this.state.concat([
            {id:2,name:"Another Name"}
        ]))
    }

    render: function() {
        return (
            <div>
                <h1>App main component! </h1>
                <button onClick={this.addChild}>Add component</button>
                {
                    this.state.map((item) => (
                        <SampleComponent key={item.id} name={item.name}/>
                    ))
                }
            </div>
        );
    }

});

4
ধন্যবাদ! আমি এই ঘটনাটি মিস করেছি যে উপাদানগুলি তাদের রাজ্যের ভিত্তিতে রেন্ডার () এ সংজ্ঞায়িত করা যেতে পারে। এখানে আপনার উত্তরটি সবচেয়ে সম্পূর্ণ এক (উপাদানগুলির সাথে জনগোষ্ঠী রাষ্ট্রের উল্লেখ) এবং প্রশ্নের সঠিক উত্তর দেয় :)
জাস্টিন ট্রেভেইন

আপনি যুক্ত করা বাচ্চাদের কীভাবে প্রপসগুলি পাস করবেন?
ব্রাইটইন্টেলডাস্ক

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

4
@ ইলিশাবেথ হ্যাঁ, ঠিক আছে। আপনার কাছে দুটি প্রধান বিকল্প রয়েছে: হয় সর্বদা সবকিছু রেন্ডার করুন এবং কেবল CSS ব্যবহার করে জিনিসগুলি গোপন করুন, শর্তাধীন CSS ক্লাস প্রয়োগ করুন বা ইনলাইন স্টাইলগুলি; বা শর্তসাপেক্ষে জিনিসগুলি রেন্ডার করুন, পুনরায় প্রতিক্রিয়া করুন উপাদানটি বা আপনার অ্যাপের স্থিতির উপর নির্ভর করে বাতিল করুন। এই দুটি পদ্ধতির পক্ষে মতামত রয়েছে এবং আপনার প্রয়োজনের উপর নির্ভর করে প্রায়শই একই অ্যাপ্লিকেশনটিতে বিভিন্ন উপাদান ব্যবহার করা হয়।
নিকোলাই মাভরঙ্কভ

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

7

প্রথমত, আমি ডকুমেন্ট.বডি ব্যবহার করব না । পরিবর্তে একটি খালি ধারক যুক্ত করুন:

index.html:

<html>
    <head></head>
    <body>
        <div id="app"></div>
    </body>
</html>

তারপরে কেবলমাত্র আপনার <App />উপাদানটি রেন্ডার করতে বেছে নিন :

main.js:

var App = require('./App.js');
ReactDOM.render(<App />, document.getElementById('app'));

এর মধ্যে App.jsআপনি আপনার অন্যান্য উপাদানগুলি আমদানি করতে পারেন এবং আপনার ডোম রেন্ডার কোডটিকে সম্পূর্ণ উপেক্ষা করতে পারেন:

App.js:

var SampleComponent = require('./SampleComponent.js');

var App = React.createClass({
    render: function() {
        return (
            <div>
                <h1>App main component!</h1>
                <SampleComponent name="SomeName" />
            </div>
        );
    }
});

SampleComponent.js:

var SampleComponent = React.createClass({
    render: function() {
        return (
            <div>
                <h1>Sample Component!</h1>
            </div>
        );
    }
});

তারপরে আপনি প্রয়োজনীয় উপাদানগুলির ফাইলগুলিতে আমদানি করে যে কোনও সংখ্যক উপাদানকে প্রোগ্রামগতভাবে ইন্টারঅ্যাক্ট করতে পারেন require


কোনও সমস্যা নেই, আমি কেবল কাউকে এটির অনুলিপি-পেস্ট করতে এবং তারপরে ঘন্টাগুলি ব্যয় করতে দেখতে পেয়েছি ...
নীল টুইস্ট

6

ক্রিসের উত্তরের ভিত্তিতে আমার সমাধানটি এখানে ভাগ করে নিচ্ছি। আশা করি এটি অন্যকে সহায়তা করতে পারে।

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

export class Settings extends React.PureComponent {
  render() {
    const loading = (<div>I'm Loading</div>);
    let content = [];
    let pushMessages = null;
    let emailMessages = null;

    if (this.props.pushPreferences) {
       pushMessages = (<div>Push Content Here</div>);
    }
    if (this.props.emailPreferences) {
      emailMessages = (<div>Email Content Here</div>);
    }

    // Push the components in the order I want
    if (emailMessages) content.push(emailMessages);
    if (pushMessages) content.push(pushMessages);

    return (
      <div>
        {content.length ? content : loading}
      </div>
    )
}

এখন, আমি বুঝতে পারি যে আমি কেবল নীচে {pushMessages}এবং {emailMessages}সরাসরি আমার return()নীচের অংশে রাখতে পেরেছি , কিন্তু ধরে নিচ্ছি যে আমার আরও শর্তযুক্ত সামগ্রী রয়েছে, আমার return()কেবল বিশৃঙ্খলা দেখাবে।


4

প্রথমত একটি সতর্কবাণী: আপনি ডওমের সাথে টিঙ্কার কখনও করবেন না যা প্রতিক্রিয়া দ্বারা পরিচালিত হয়, যা আপনি কল করে যা করছেন ReactDOM.render(<SampleComponent ... />);

প্রতিক্রিয়া সহ, আপনি সরাসরি অ্যাপ্লিকেশন মধ্যে নমুনা কম্পোনেন্ট ব্যবহার করা উচিত।

var App = require('./App.js');
var SampleComponent = require('./SampleComponent.js');
ReactDOM.render(<App/>, document.body);

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

var App = React.createClass({
    render: function() {
        return (
            <div>
                <h1>App main component! </h1>
                <SampleComponent name="SomeName"/>
            </div>
        );
    }
});

এরপরে আপনি একটি তালিকা ব্যবহার করতে আপনার অ্যাপ উপাদানটি প্রসারিত করতে পারেন।

var App = React.createClass({
    render: function() {
        var componentList = [
            <SampleComponent name="SomeName1"/>,
            <SampleComponent name="SomeName2"/>
        ]; // Change this to get the list from props or state
        return (
            <div>
                <h1>App main component! </h1>
                {componentList}
            </div>
        );
    }
});

আমি আপনাকে সুপারিশ করব যে আপনি প্রতিক্রিয়া নথিটি দেখুন এবং তারপরে "শুরু করুন" নির্দেশাবলী অনুসরণ করুন। আপনি যে সময়টি ব্যয় করেছেন তা পরে তা পরিশোধ করবে।

https://facebook.github.io/react/index.html


অ্যারে কীভাবে ম্যাপিং ছাড়াই বাচ্চা সংমিশ্রণকে জনপ্রিয় করবে?
সোলঙ্কি ...

4
@ সোলানকি ... তালিকার প্রতিক্রিয়া উপাদানগুলির তালিকা না হলে কেবল একটি ম্যাপিং প্রয়োজন pping এখানে তালিকাটি দুটি SampleComponentএর, যার ফলে ম্যাপিংয়ের প্রয়োজন নেই। যদি তালিকার নামের তালিকা থাকে তবে উপাদানগুলির প্রতিক্রিয়াটির জন্য ম্যাপিংয়ের প্রয়োজন হবে।
নিল টুইস্ট

@ সোলানকি ... মনে রাখবেন যে ম্যাপিংয়ের আউটপুট কেবল অন্য তালিকা
নীল টুইস্ট

4
ঠিক আমি খুঁজছেন ছিল কি. আমার ব্যবহারের ক্ষেত্রে জেএসএক্স উপাদানগুলিকে <div>একটি ভেরিয়েবলের জন্য নির্ধারিত ফাঁকাতে pushচ্ছিকভাবে চাপ দেওয়া দরকার ছিল যা {content}আমার রিটার্ন স্টেটমেন্টের মতো জেএসএক্স .োকানো হয়েছিল । খালি অ্যারে ব্যবহার করা এত সহজ ছিল!
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.