আমি প্রতিক্রিয়া সহ ফিল্টারযোগ্য তালিকা বাস্তবায়নের প্রক্রিয়াধীন। নীচের চিত্রে তালিকার কাঠামোটি দেখানো হয়েছে।
প্রাকদর্শন করুন
এটি কীভাবে কাজ করবে বলে বর্ণনা করা হচ্ছে:
- রাষ্ট্রটি সর্বোচ্চ স্তরের উপাদান,
Searchউপাদানটিতে থাকে। - রাষ্ট্রটি নীচে বর্ণিত:
{
দৃশ্যমান: বুলিয়ান,
ফাইল: অ্যারে,
ফিল্টারড: অ্যারে,
ক্যোরি: স্ট্রিং,
বর্তমানে সিলেক্ট ইন্ডেক্স: পূর্ণসংখ্যা
}
filesসম্ভাব্যভাবে খুব বড়, অ্যারে ফাইল ফাইলগুলি রয়েছে (10000 এন্ট্রি একটি প্রশংসনীয় সংখ্যা)।filteredব্যবহারকারী কমপক্ষে 2 টি অক্ষর টাইপ করার পরে ফিল্টার করা অ্যারে হয়। আমি জানি এটি ডেরাইভেটিভ ডেটা এবং রাজ্যে এটি সংরক্ষণ করার বিষয়ে যেমন একটি যুক্তি তৈরি করা যেতে পারে তবে এটির জন্য এটি প্রয়োজনcurrentlySelectedIndexফিল্টারড তালিকা থেকে বর্তমানে নির্বাচিত উপাদানগুলির সূচক যা।ব্যবহারকারীর
Inputউপাদানগুলিতে 2 টিরও বেশি বর্ণ রয়েছে , অ্যারে ফিল্টার করা হয় এবং ফিল্টার করা অ্যারেতে প্রতিটি প্রবেশের জন্য একটিResultউপাদান রেন্ডার করা হয়প্রতিটি
Resultউপাদান পুরো পথটি প্রদর্শন করছে যা কোয়েরির সাথে আংশিক মিল রয়েছে এবং পথটির আংশিক মিলের অংশটি হাইলাইট করা হয়েছে। উদাহরণস্বরূপ কোনও ফলাফলের ডিওএম, ব্যবহারকারী যদি 'লে' টাইপ করেন তবে এটি এমন কিছু হতে পারে:<li>this/is/a/fi<strong>le</strong>/path</li>Inputউপাদানটি অ্যারেরcurrentlySelectedIndexউপর ভিত্তি করে পরিবর্তনগুলিকে কেন্দ্র করে যখন ব্যবহারকারী উপরে বা নীচে কীগুলিfilteredটিপান। এটিResultসূচকটির সাথে মেলে এমন উপাদানটিকে পুনরায় রেন্ডার করায় নির্বাচিত হিসাবে চিহ্নিত হিসাবে চিহ্নিত করে
সমস্যা
প্রাথমিকভাবে আমি filesপ্রতিক্রিয়াটির বিকাশের সংস্করণটি ব্যবহার করে একটি ছোট্ট যথেষ্ট পরিমাণে অ্যারে দিয়ে এটি পরীক্ষা করেছি এবং সব ঠিকঠাক কাজ করেছে।
সমস্যাটি উপস্থিত হয়েছিল যখন আমাকে files10000 এন্ট্রি হিসাবে বড় অ্যারের সাথে ডিল করতে হয়েছিল । ইনপুটটিতে 2 টি অক্ষর টাইপ করা একটি বড় তালিকা তৈরি করবে এবং যখন আমি নেভিগেট করতে উপরে এবং ডাউন কী টিপতাম তখন এটি খুব পিছিয়ে থাকবে।
প্রথমে আমার কাছে উপাদানগুলির জন্য একটি সংজ্ঞায়িত উপাদান Resultছিল না এবং আমি কেবলমাত্র Searchউপাদানটির প্রতিটি রেন্ডারে ফ্লাইতে তালিকা তৈরি করছিলাম , যেমন:
results = this.state.filtered.map(function(file, index) {
var start, end, matchIndex, match = this.state.query;
matchIndex = file.indexOf(match);
start = file.slice(0, matchIndex);
end = file.slice(matchIndex + match.length);
return (
<li onClick={this.handleListClick}
data-path={file}
className={(index === this.state.currentlySelected) ? "valid selected" : "valid"}
key={file} >
{start}
<span className="marked">{match}</span>
{end}
</li>
);
}.bind(this));
আপনি বলতে পারেন যে যতবার currentlySelectedIndexপরিবর্তন হয়েছে, এটি পুনরায় রেন্ডার করবে এবং প্রতিবার তালিকাটি পুনরায় তৈরি করা হবে। আমি ভেবেছিলাম যেহেতু আমি keyপ্রতিটি liউপাদানটির জন্য একটি মান নির্ধারণ করেছি প্রতিক্রিয়াটি অন্য liযে কোনও উপাদানগুলির classNameপরিবর্তন ঘটে নি তার পুনরায় রেন্ডারিং এড়াতে পারবে , তবে দৃশ্যত এটি এমনটি ছিল না।
আমি Resultউপাদানগুলির জন্য একটি শ্রেণি সংজ্ঞায়িত করে শেষ করেছি , যেখানে এটি স্পষ্ট করে যাচাই করে যে প্রতিটি Resultউপাদান পূর্বে নির্বাচিত হয়েছিল এবং বর্তমান ব্যবহারকারীর ইনপুটের উপর ভিত্তি করে পুনরায় রেন্ডার করা উচিত কিনা:
var ResultItem = React.createClass({
shouldComponentUpdate : function(nextProps) {
if (nextProps.match !== this.props.match) {
return true;
} else {
return (nextProps.selected !== this.props.selected);
}
},
render : function() {
return (
<li onClick={this.props.handleListClick}
data-path={this.props.file}
className={
(this.props.selected) ? "valid selected" : "valid"
}
key={this.props.file} >
{this.props.children}
</li>
);
}
});
এবং তালিকাটি এখন যেমন তৈরি করা হয়েছে:
results = this.state.filtered.map(function(file, index) {
var start, end, matchIndex, match = this.state.query, selected;
matchIndex = file.indexOf(match);
start = file.slice(0, matchIndex);
end = file.slice(matchIndex + match.length);
selected = (index === this.state.currentlySelected) ? true : false
return (
<ResultItem handleClick={this.handleListClick}
data-path={file}
selected={selected}
key={file}
match={match} >
{start}
<span className="marked">{match}</span>
{end}
</ResultItem>
);
}.bind(this));
}
This made performance slightly better, but it's still not good enough. Thing is when I tested on the production version of React things worked buttery smooth, no lag at all.
BOTTOMLINE
Is such a noticeable discrepancy between development and production versions of React normal?
Am I understanding/doing something wrong when I think about how React manages the list?
UPDATE 14-11-2016
I have found this presentation of Michael Jackson, where he tackles an issue very similar to this one: https://youtu.be/7S8v8jfLb1Q?t=26m2s
The solution is very similar to the one proposed by AskarovBeknar's answer, below
UPDATE 14-4-2018
Since this is apparently a popular question and things have progressed since the original question was asked, while I do encourage you to watch the video linked above, in order to get a grasp of a virtual layout, I also encourage you to use the React Virtualized library if you do not want to re-invent the wheel.



