2015 সম্পাদনা করুন
কেউ আমার সমাধান দিয়ে এনপিএম-তে একটি প্রকল্প তৈরি করেছেন: https://github.com/lovasoa/react-contentedable
06/2016 সম্পাদনা করুন: আমি ব্রাউজারটি কেবলমাত্র তাকে দেওয়া এইচটিএমএলকে "পুনরায় ফর্ম্যাট" করার চেষ্টা করে তখনই একটি নতুন সমস্যা হ'ল, যা উপাদানটিকে সর্বদা পুনরায় রেন্ডারিংয়ের দিকে নিয়ে যায়। দেখা
07/2016 সম্পাদনা করুন: এখানে আমার উত্পাদনের বিষয়বস্তু সম্পাদনযোগ্য বাস্তবায়ন। এটিতে কিছু অতিরিক্ত বিকল্প রয়েছে react-contenteditable
যা আপনি চাইতে পারেন, সহ:
- লকিং
- আবশ্যকীয় API টি এইচটিএমএল টুকরো এম্বেড করার অনুমতি দেয়
- সামগ্রী পুনরায় ফর্ম্যাট করার ক্ষমতা
সারসংক্ষেপ:
আমি নতুন সমস্যা না পাওয়া পর্যন্ত ফেকরাইনব্রিজ্যান্ডের সমাধান কিছু সময়ের জন্য আমার পক্ষে বেশ ভাল কাজ করেছে। কন্টেন্টএডেটিবগুলি একটি ব্যথা এবং প্রতিক্রিয়াটির সাথে মোকাবিলা করা সত্যিই সহজ নয় ...
এই জেএসফিডাল সমস্যাটি দেখায়।
আপনি দেখতে পাচ্ছেন, যখন আপনি কয়েকটি অক্ষর টাইপ করেন এবং ক্লিক করুন Clear
, সামগ্রীটি সাফ হয় না। এটি কারণ আমরা সর্বশেষ জ্ঞাত ভার্চুয়াল ডোম মানকে সন্তুষ্ট করতে পুনরায় সেট করার চেষ্টা করি।
সুতরাং এটি মনে হয়:
- আপনার
shouldComponentUpdate
ক্যারেট অবস্থানের জাম্পগুলি প্রতিরোধ করা দরকার
- আপনি যদি
shouldComponentUpdate
এইভাবে ব্যবহার করেন তবে আপনি প্রতিক্রিয়াটির ভিডিএএম ডিফিং অ্যালগরিদমের উপর নির্ভর করতে পারবেন না ।
সুতরাং আপনার একটি অতিরিক্ত লাইন প্রয়োজন যাতে যখনই shouldComponentUpdate
হ্যাঁ ফিরে আসে, আপনি নিশ্চিত যে ডম সামগ্রীটি আসলে আপডেট হয়েছে।
সুতরাং এখানে সংস্করণটি যুক্ত করে componentDidUpdate
এবং হয়ে যায়:
var ContentEditable = React.createClass({
render: function(){
return <div id="contenteditable"
onInput={this.emitChange}
onBlur={this.emitChange}
contentEditable
dangerouslySetInnerHTML={{__html: this.props.html}}></div>;
},
shouldComponentUpdate: function(nextProps){
return nextProps.html !== this.getDOMNode().innerHTML;
},
componentDidUpdate: function() {
if ( this.props.html !== this.getDOMNode().innerHTML ) {
this.getDOMNode().innerHTML = this.props.html;
}
},
emitChange: function(){
var html = this.getDOMNode().innerHTML;
if (this.props.onChange && html !== this.lastHtml) {
this.props.onChange({
target: {
value: html
}
});
}
this.lastHtml = html;
}
});
ভার্চুয়াল ডোমটি পুরানো থাকে এবং এটি সবচেয়ে কার্যকর কোড নাও হতে পারে তবে কমপক্ষে এটি কার্যকর হয় :) আমার বাগটি সমাধান হয়েছে
বিবরণ:
1) ক্যারেট জাম্প এড়ানোর জন্য আপনি যদি কম্পোনেন্টটি আপডেট করেন তবে কন্টেন্টটেটেবল কখনই রিরেন্ডার করে না (কমপক্ষে কীস্ট্রোকগুলিতে)
2) যদি উপাদানটি কখনই কী স্ট্রোকটিতে পুনরায় সরবরাহ করে না, তবে প্রতিক্রিয়াটি এই তর্কযোগ্যতার জন্য একটি পুরানো ভার্চুয়াল ডোম রাখে।
3) যদি প্রতিক্রিয়াটি ভার্চুয়াল ডোম গাছটিতে সন্তুষ্টির একটি পুরানো সংস্করণ রাখে, তবে আপনি যদি ভার্চুয়াল ডোমের পুরানো মানের সাথে কনসেন্টটেটেবলটিকে পুনরায় সেট করার চেষ্টা করেন, তবে ভার্চুয়াল ডোম ভিন্ন হওয়ার সময়, প্রতিক্রিয়াটি গণনা করবে যে এতে কোনও পরিবর্তন নেই ডিওএম প্রয়োগ!
এটি বেশিরভাগ ক্ষেত্রে ঘটে যখন:
- আপনার প্রাথমিকভাবে একটি খালি কনটেস্টেবলযোগ্য রয়েছে (shouldCompenderUpdate = true, prop = "", পূর্ববর্তী vdom = N / A),
- ব্যবহারকারী কিছু পাঠ্য টাইপ করেন এবং আপনি রেন্ডারিংগুলি প্রতিরোধ করেন (shouldCompenderUpdate = মিথ্যা, প্রোপ = পাঠ্য, পূর্ববর্তী vdom = "")
- ব্যবহারকারী কোনও বৈধতা বোতাম ক্লিক করার পরে, আপনি সেই ক্ষেত্রটি খালি করতে চান (shouldCompenderUpdate = মিথ্যা, প্রোপ = "", পূর্ববর্তী vdom = "")
- যেহেতু সদ্য উত্পাদিত এবং পুরাতন দু'টি ভোম "" রয়েছে, প্রতিক্রিয়া ডোমটিকে স্পর্শ করে না।
initialValue
into ুকিয়ে দিয়েছিstate
এবং এতে ব্যবহার করছিrender
, তবে আমি প্রতিক্রিয়াটিকে এটিকে আরও আপডেট করতে দিচ্ছি না।