অবজেক্টের অ্যারে থেকে রেন্ডারিং রিঅ্যাক্ট উপাদানগুলি


105

আমার কাছে স্টেশান নামক কিছু ডেটা রয়েছে যা একটি অ্যারে যা অবজেক্টসযুক্ত।

stations : [
  {call:'station one',frequency:'000'},
  {call:'station two',frequency:'001'}
]

আমি প্রতিটি অ্যারে পজিশনের জন্য একটি ইউআই উপাদান রেন্ডার করতে চাই। এখন পর্যন্ত আমি লিখতে পারি

 var stationsArr = []
 for (var i = 0; i < this.data.stations.length; i++) {
     stationsArr.push(
         <div className="station">
             {this.data}
         </div>
     )
 }

এবং তারপর রেন্ডার

render(){
 return (
   {stationsArr}
 )
}

সমস্যাটি হ'ল আমি সমস্ত তথ্য মুদ্রণ করে আছি। আমি পরিবর্তে কেবল একটি চাবি প্রদর্শন করতে চাই {this.data.call}তবে এটি কিছুই মুদ্রণ করে না।

আমি কীভাবে এই ডেটাটি লুপ করব এবং অ্যারের প্রতিটি পজিশনের জন্য একটি নতুন ইউআই উপাদান ফিরিয়ে আনব?


আমি ভুল হতে পারি তবে আমি মনে করি ফাংশনের অভ্যন্তরের stationsArrপরিবর্তে আপনার ব্যবহার করা উচিত । stationsrender
তাহির আহমেদ

উত্তর:


155

আপনি স্টেশনগুলির তালিকাকে প্রতিক্রিয়া উপাদানগুলিতে ম্যাপ করতে পারেন।

প্রতিক্রিয়া> = 16 দিয়ে, অতিরিক্ত এইচটিএমএল উপাদান মোড়কের প্রয়োজন ছাড়াই একই উপাদান থেকে একাধিক উপাদান ফেরত পাওয়া সম্ভব। 16.2 সাল থেকে, টুকরো তৈরি করার জন্য একটি নতুন বাক্য গঠন <> যদি এটি কাজ না করে বা আপনার আইডিই সমর্থন করে না, আপনি <React.Fragment>পরিবর্তে ব্যবহার করতে পারেন । 16.0 থেকে 16.2 এর মধ্যে আপনি টুকরোগুলির জন্য খুব সাধারণ পলিফিল ব্যবহার করতে পারেন ।

নিম্নলিখিত চেষ্টা করুন

// Modern syntax >= React 16.2.0
const Test = ({stations}) => (
  <>
    {stations.map(station => (
      <div className="station" key={station.call}>{station.call}</div>
    ))}
  </>
); 

// Modern syntax < React 16.2.0
// You need to wrap in an extra element like div here

const Test = ({stations}) => (
  <div>
    {stations.map(station => (
      <div className="station" key={station.call}>{station.call}</div>
    ))}
  </div>
); 

// old syntax
var Test = React.createClass({
    render: function() {
        var stationComponents = this.props.stations.map(function(station) {
            return <div className="station" key={station.call}>{station.call}</div>;
        });
        return <div>{stationComponents}</div>;
    }
});

var stations = [
  {call:'station one',frequency:'000'},
  {call:'station two',frequency:'001'}
]; 

ReactDOM.render(
  <div>
    <Test stations={stations} />
  </div>,
  document.getElementById('container')
);

keyগুণটি ভুলে যাবেন না !

https://jsfiddle.net/69z2wepo/14377/


@ থটগিবিবিগুয়ে: ওহ হ্যাঁ! এটি সঠিক উত্তর হতে পারে। আপনার সন্তানের উপাদানগুলির চারপাশে মোড়ানো দরকার। আপনার renderফাংশনটি অবশ্যই একটি একক উপাদান ফেরত দিতে হবে।
তাহির আহমেদ

প্রতিটি স্টেশন উপাদানগুলির জন্য একটি মূল বৈশিষ্ট্য প্রস্তাব করার কারণ কী হবে? আমি যা বলছি তা হ'ল, এখনই প্রয়োজন না হলে কী পরিবর্তন হবে?
thatgibbyguy

4
@ থ্যাটগিবিবিগুয় এই ক্ষেত্রে এটি খুব বেশি সুবিধা দেয় না। আরও উন্নত উদাহরণগুলিতে এটি আরও ভাল রেন্ডারিং পারফরম্যান্সের অনুমতি দেয় কারণ প্রতিক্রিয়াটি সহজেই জানতে পারে যে কোনও বিদ্যমান নোড স্টেশন অ্যারেতে অন্য কোনও জায়গায় চলে গেছে কিনা, সুতরাং এটি একটি বিদ্যমান ডোম নোডকে ধ্বংস করতে এবং পুনরায় তৈরি করতে এড়ানো (এবং ডোম নোড মাউন্ট করাও থাকবে) । এটি প্রতিক্রিয়া দস্তাবেজে রয়েছে: facebook.github.io/react/docs/reconcistance.html#keys
সেবাস্তিয়ান লরবার

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

@ এলহম্ব্রে stations.map((station,index) => { })আমার পক্ষে ভাল কাজ করে
সেবাস্তিয়ান লরবার

49

আমার কাছে এমন উত্তর আছে যা আমার মতো নতুনদের জন্য কিছুটা বিভ্রান্তি হতে পারে। আপনি কেবল mapউপাদানগুলি রেন্ডার পদ্ধতিতে ব্যবহার করতে পারেন ।

render () {
   return (
       <div>
           {stations.map(station => <div key={station}> {station} </div>)} 
       </div>
   );
}

11
এটির জন্য একটি keyপ্রোপ reactjs.org/docs/lists-and-keys.html#keys দরকার
ডেভিড ব্যারেট

4
কখনও কখনও এটি অনেক বেশি সহায়ক। :)
আগস্ট'১৮

7

this.data সম্ভবত সমস্ত ডেটা ধারণ করে, তাই আপনাকে এরকম কিছু করার দরকার হবে:

var stations = [];
var stationData = this.data.stations;

for (var i = 0; i < stationData.length; i++) {
    stations.push(
        <div key={stationData[i].call} className="station">
            Call: {stationData[i].call}, Freq: {stationData[i].frequency}
        </div>
    )
}

render() {
  return (
    <div className="stations">{stations}</div>
  )
}

অথবা আপনি mapযদি ES6 ব্যবহার করছেন তবে আপনি ব্যবহার করতে পারবেন এবং তীর ফাংশনগুলি:

const stations = this.data.stations.map(station =>
    <div key={station.call} className="station">
      Call: {station.call}, Freq: {station.frequency}
    </div>
);

4
এটি বর্তমান প্রতিক্রিয়া সংস্করণে কাজ করবে না, আপনি কোনও অ্যারে ফিরিয়ে দিতে পারবেন না।
আফতাব নাভিদ

@ আফতাব নাভিদকে ধন্যবাদ আমি এটি আপডেট করেছি, একটি উপাদান সরবরাহ করা উচিত তবে এর ভিতরে উপাদানগুলির একটি অ্যারে থাকা বৈধ
ডমিনিক

@ আফতাবনাভিদ যেমন বলেছেন, <16 সংস্করণটি প্রতিক্রিয়া দেখায়, আপনাকে উপরেরটি ব্যবহার করতে হবে, অন্যথায় আপনি কেবল return stations;( codepen.io/pawelgrzybek/pen/WZEKWj ) করতে পারেন
চিকেন সুপ

1

বেশ কয়েকটি উপায় রয়েছে যা ব্যবহার করা যায়।

const stations = [
  {call:'station one',frequency:'000'},
  {call:'station two',frequency:'001'}
];
const callList = stations.map(({call}) => call)

সমাধান 1

<p>{callList.join(', ')}</p>

সমাধান 2

<ol>    
  { callList && callList.map(item => <li>{item}</li>) }
</ol>

সদৃশ-এন্টোনেলি-z8372 সম্পাদনা করুন

অবশ্যই উপলব্ধ অন্যান্য উপায় আছে।

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