এটি.সেটস্টেট রাজ্যগুলি মার্জ করে না যেমনটি আমি আশা করি


160

আমার নিম্নলিখিত অবস্থা রয়েছে:

this.setState({ selected: { id: 1, name: 'Foobar' } });  

তারপরে আমি রাষ্ট্রটি আপডেট করি:

this.setState({ selected: { name: 'Barfoo' }});

setStateমনে হয় যেহেতু মার্জ করার জন্য আমি এটিটি আশা করব:

{ selected: { id: 1, name: 'Barfoo' } }; 

তবে পরিবর্তে এটি আইডি খায় এবং রাষ্ট্রটি হ'ল:

{ selected: { name: 'Barfoo' } }; 

এই প্রত্যাশিত আচরণ এবং কোনও নেস্টেড স্টেট অবজেক্টের কেবলমাত্র একটি সম্পত্তি আপডেট করার সমাধান কী?

উত্তর:


143

আমি মনে setState()করি পুনরাবৃত্ত মার্জ করে না।

আপনি this.state.selectedনতুন রাষ্ট্র তৈরি করতে বর্তমান অবস্থার মানটি ব্যবহার করতে পারেন এবং তারপরে কল setState()করতে পারেন:

var newSelected = _.extend({}, this.state.selected);
newSelected.name = 'Barfoo';
this.setState({ selected: newSelected });

রাষ্ট্রের অগভীর অনুলিপি তৈরি করে রাজ্যের _.extend()বিদ্যমান selectedঅংশে পরিবর্তন রোধ করতে আমি এখানে ফাংশন ফাংশন (আন্ডারস্কোর.জেএস লাইব্রেরি থেকে) ব্যবহার করেছি ।

আরেকটি সমাধান setStateRecursively()হ'ল এটি লিখতে যা কোনও নতুন রাজ্যে পুনরাবৃত্ত হয়ে যায় এবং তারপরে replaceState()এটি কল করে:

setStateRecursively: function(stateUpdate, callback) {
  var newState = mergeStateRecursively(this.state, stateUpdate);
  this.replaceState(newState, callback);
}

7
আপনি যদি এটি একাধিকবার করেন বা নির্ভরযোগ্যতার সাথে কাজ করেন বা কোনও সম্ভাবনা রয়েছে তখন রিপ্লেসমেন্ট কলগুলি সজ্জিত করবে এবং শেষটি জিতবে?
এডোলোলিন

111
যে লোকেরা প্রসারিত ব্যবহার পছন্দ করে এবং this.setState({ selected: { ...this.state.selected, name: 'barfoo' } })this.setState({ selected: _extends({}, this.state.selected, { name: 'barfoo' }) });
বাবেলগুলিও

8
@ পিকেলস এটি দুর্দান্ত, প্রতিক্রিয়াটির জন্য দুর্দান্তভাবে মূর্তিমান এবং এর প্রয়োজন নেই underscore/ lodash। দয়া করে এটির নিজের উত্তরে এটি স্পিন করুন।
এরিকোসো

14
this.state অগত্যা আপ-টু-ডেট নয় । আপনি প্রসারিত পদ্ধতিটি ব্যবহার করে অপ্রত্যাশিত ফলাফল পেতে পারেন। আপডেট ফাংশনটিতে পাস করা setStateসঠিক সমাধান।
Strom

1
@ এডওয়ার্ড ডি সুজা এটি লোডাশ লাইব্রেরি। এটিকে সাধারণত আন্ডারস্কোর হিসাবে ডাকা হয়, একইভাবে jQueryটিকে ডলারসাইন হিসাবে ডাকা হয়। (সুতরাং, এটি _.extend ()।)
এমজেইকে

96

অপ্রত্যাশিত সাহায্যকারীদের সম্প্রতি React.addons এ যুক্ত করা হয়েছিল, সুতরাং সেই সাথে আপনি এখন এর মতো কিছু করতে পারেন:

var newState = React.addons.update(this.state, {
  selected: {
    name: { $set: 'Barfoo' }
  }
});
this.setState(newState);

অপ্রচলতা সাহায্যকারীদের ডকুমেন্টেশন


7
আপডেট হ্রাস করা হয়। ফেসবুক.
github.io/react/docs/update.html

3
@ থেদানোটো দেখে মনে হচ্ছে যে React.addons.update()পদ্ধতিটি হ্রাস পেয়েছে তবে প্রতিস্থাপন লাইব্রেরি github.com/kolodny/immutability-helper এ একটি সমতুল্য update()ফাংশন রয়েছে ।
চরম বিশৃঙ্খল

37

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

সেটস্টেট () অবিলম্বে এই.স্টেটকে রূপান্তরিত করে না তবে একটি মুলতুবি থাকা অবস্থায় অবস্থিতি স্থানান্তর তৈরি করে। এই পদ্ধতিটি কল করার পরে এটি.স্টেট অ্যাক্সেস করা সম্ভাব্যভাবে বিদ্যমান মানটি ফিরিয়ে আনতে পারে।

এর অর্থ সেটসেটে পরবর্তী কলগুলিতে রেফারেন্স হিসাবে "বর্তমান" অবস্থা ব্যবহার করা অবিশ্বাস্য। উদাহরণ স্বরূপ:

  1. স্টেট অবজেক্টে পরিবর্তনের জন্য সারিবদ্ধ স্টেটে প্রথম কল
  2. সেটস্টেটে দ্বিতীয় কল। আপনার রাজ্য নেস্টেড অবজেক্ট ব্যবহার করে, তাই আপনি মার্জ করতে চান। সেটস্টেট কল করার আগে আপনি বর্তমান স্থিতি বস্তুটি পান। উপরের সেটস্টেটে প্রথম কলের করা সারিবদ্ধ পরিবর্তনগুলি এই অবজেক্টটি প্রতিফলিত করে না, কারণ এটি এখনও মূল অবস্থা, যা এখন "বাসি" হিসাবে বিবেচনা করা উচিত।
  3. একত্রিত করা। ফলাফলটি হ'ল মূল "বাসী" রাষ্ট্র এবং নতুন ডেটা যা আপনি সবেমাত্র সেট করেছেন, প্রাথমিক সেটস্টেট কল থেকে পরিবর্তনগুলি প্রতিফলিত হয় না। আপনার সেটস্টেট কলের এই দ্বিতীয় পরিবর্তনটি রয়েছে।
  4. প্রক্রিয়া সারিতে প্রতিক্রিয়া। প্রথম সেটস্টেট কল প্রক্রিয়া করা হয়, রাষ্ট্র আপডেট করে। দ্বিতীয় সেটস্টেট কল প্রক্রিয়া করা হয়, রাষ্ট্র আপডেট করে। দ্বিতীয় সেটস্টেটের অবজেক্টটি এখন প্রথমটিকে প্রতিস্থাপন করেছে এবং যেহেতু সেই কলটি করার সময় আপনার কাছে থাকা ডেটা বাসি ছিল, তাই দ্বিতীয় কলটিতে পরিবর্তিত বাসি ডেটা প্রথম কলটিতে পরিবর্তনগুলি ক্লোবারড করেছে যা হারিয়ে গেছে।
  5. যখন সারি খালি থাকে, প্রতিক্রিয়া নির্ধারণ করে etc. ইত্যাদি রেন্ডার করতে হবে কিনা এই মুহুর্তে আপনি দ্বিতীয় সেটস্টেট কলটিতে পরিবর্তনগুলি রেন্ডার করবেন এবং এটি এমন হবে যেন প্রথম সেটস্টেট কলটি কখনও ঘটেনি।

যদি আপনাকে বর্তমান অবস্থা ব্যবহার করতে হয় (যেমন কোনও নেস্টেড অবজেক্টে ডেটা মার্জ করার জন্য), সেটস্টেট বিকল্পভাবে কোনও ফাংশনটিকে কোনও বস্তুর পরিবর্তে আর্গুমেন্ট হিসাবে গ্রহণ করে; ফাংশনটি পূর্বের কোনও আপডেটের পরে রাষ্ট্র হিসাবে ডাকা হয় এবং রাষ্ট্রটিকে আর্গুমেন্ট হিসাবে পাস করে - সুতরাং এটি পূর্ববর্তী পরিবর্তনের প্রতি শ্রদ্ধার জন্য গ্যারান্টিযুক্ত পারমাণবিক পরিবর্তনগুলি করতে ব্যবহার করা যেতে পারে।


5
কীভাবে এটি করতে হয় তার কোনও উদাহরণ বা আরও ডক্স রয়েছে? আফিক্স, কেউ এটিকে আমলে নেয় না।
জোসেফ.বি

@ ডেনিস নীচে আমার উত্তর চেষ্টা করুন।
মার্টিন ডসন

সমস্যাটি কোথায় আছে তা আমি দেখতে পাচ্ছি না। আপনি যা বর্ণনা করছেন তা কেবল তখনই ঘটতে পারে যদি আপনি সেটস্টেট কল করার পরে "নতুন" স্থিতি অ্যাক্সেস করার চেষ্টা করেন। এটি সম্পূর্ণ ভিন্ন সমস্যা যা ওপি প্রশ্নের সাথে কোনও সম্পর্ক নেই। সেটস্টেটে কল করার আগে পুরানো রাজ্যে অ্যাক্সেস করা যাতে আপনি একটি নতুন রাষ্ট্রীয় অবজেক্ট তৈরি করতে পারেন তা কখনই কোনও সমস্যা হবেনা এবং বাস্তবে প্রতিক্রিয়াটি প্রত্যাশা করে এমনটিই ছিল।
Nextgentech

@nextgentech "setState কলিং যাতে আপনি গঠন করা যেতে পারে একটি নতুন রাষ্ট্র বস্তুর একটি সমস্যা হতে না হবে সামনে পুরাতন রাষ্ট্র অ্যাক্সেস করা" করছি ভুল আপনি -। আমরা এর উপর ভিত্তি করে ওভাররাইটিং স্টেটের বিষয়ে কথা বলছি this.state, যখন আপনি এটি অ্যাক্সেস করবেন তখন বাসি (বা বরং মুলতুবি থাকা আপডেট) থাকতে পারে।
ম্যাডব্রেকস

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

10

আমি অন্য লাইব্রেরি ইনস্টল করতে চাইনি তাই এখানে আরও একটি সমাধান রয়েছে।

পরিবর্তে:

this.setState({ selected: { name: 'Barfoo' }});

পরিবর্তে এটি করুন:

var newSelected = Object.assign({}, this.state.selected);
newSelected.name = 'Barfoo';
this.setState({ selected: newSelected });

বা, মন্তব্যগুলিতে @ আইসিসি 97-কে ধন্যবাদ, আরও বেশি সংক্ষিপ্তভাবে তবে তর্কসাপেক্ষভাবে কম পাঠযোগ্য:

this.setState({ selected: Object.assign({}, this.state.selected, { name: "Barfoo" }) });

এছাড়াও, স্পষ্ট করে বলতে গেলে, এই উত্তরটি @bgannonpl উপরে উল্লিখিত উদ্বেগগুলির কোনও লঙ্ঘন করে না।


উপভোট, চেক। শুধু ভাবছি কেন এমন হয় না? this.setState({ selected: Object.assign(this.state.selected, { name: "Barfoo" }));
জাস্টাস রোমিজন 14

1
@ জুস্টাসরোমিজন দুর্ভাগ্যক্রমে তাহলে আপনি সরাসরি বর্তমান অবস্থাটি সংশোধন করবেন। এগুলি Object.assign(a, b)থেকে অ্যাট্রিবিউটস গ্রহণ করে b, এগুলিতে সন্নিবেশ / ওভাররাইট করে aএবং তারপরে ফিরে আসে a। আপনি যদি সরাসরি রাজ্যে পরিবর্তন করেন তবে লোকেদের প্রতিক্রিয়া জানান।
রায়ান শিলিংটন

যথাযথভাবে। কেবলমাত্র নোট করুন যে এটি কেবল অগভীর অনুলিপি / কার্যভারের জন্য কাজ করে।
ম্যাডব্রেকস

1
@JustusRomijn আপনি অনুযায়ী এটা করতে পারেন MDN বরাদ্দ এক লাইনে আপনি যোগ যদি {}প্রথম আর্গুমেন্ট হিসাবে: this.setState({ selected: Object.assign({}, this.state.selected, { name: "Barfoo" }) });। এটি আসল অবস্থাকে পরিবর্তিত করে না।
icc97

@ icc97 ভাল লাগলো! আমি আমার উত্তরে এটি যোগ করেছি।
রায়ান শিলিংটন

8

@ বিগননপল উত্তরের উপর ভিত্তি করে পূর্ববর্তী রাষ্ট্রটি সংরক্ষণ করা:

লোডাশ উদাহরণ:

this.setState((previousState) => _.merge({}, previousState, { selected: { name: "Barfood"} }));

এটি সঠিকভাবে কাজ করেছে কিনা তা পরীক্ষা করতে, আপনি দ্বিতীয় প্যারামিটার ফাংশন কলব্যাক ব্যবহার করতে পারেন:

this.setState((previousState) => _.merge({}, previousState, { selected: { name: "Barfood"} }), () => alert(this.state.selected));

অন্য বৈশিষ্ট্যগুলি বাতিল করে দেওয়ার mergeকারণে আমি ব্যবহার করেছি extend

অপরিবর্তনীয় উদাহরণটির প্রতিক্রিয়া :

import update from "react-addons-update";

this.setState((previousState) => update(previousState, {
    selected:
    { 
        name: {$set: "Barfood"}
    }
});

2

অবস্থা এই ধরনের জন্য আমার সমাধান ব্যবহার করার মত অন্য উত্তর, নির্দিষ্ট হয় অপরিবর্তনীয়তা সাহায্যকারী

যেহেতু গভীরতার সাথে রাজ্য নির্ধারণ করা একটি সাধারণ পরিস্থিতি, তাই আমি ফলোভিং মিক্সিন তৈরি করেছি:

var SeStateInDepthMixin = {
   setStateInDepth: function(updatePath) {
       this.setState(React.addons.update(this.state, updatePath););
   }
};

এই মেশিনটি আমার বেশিরভাগ উপাদানগুলিতে অন্তর্ভুক্ত থাকে এবং আমি সাধারণত setStateসরাসরি আর ব্যবহার করি না ।

এই মেশিনের সাহায্যে কাঙ্ক্ষিত প্রভাব অর্জনের জন্য আপনাকে যা করতে হবে তা হ'ল ফাংশনটি setStateinDepthনিম্নলিখিত উপায়ে কল করা :

setStateInDepth({ selected: { name: { $set: 'Barfoo' }}})

আরও তথ্যের জন্য:


দেরিতে জবাবের জন্য দুঃখিত, তবে আপনার মিক্সিন উদাহরণটি আকর্ষণীয় বলে মনে হচ্ছে। তবে, যদি আমার 2 টি নেস্টেড রাজ্য থাকে, যেমন: this.state.test.one এবং this.state.test.two। এটি কি ঠিক যে এর মধ্যে একটি আপডেট হবে এবং অন্যটি মুছে ফেলা হবে? আমি যখন প্রথমটি আপডেট করি, দ্বিতীয়টি আমি যখন রাজ্যে
থাকি তবে

hy @ mamruoc, this.state.test.twoআপনি this.state.test.oneব্যবহার আপডেট করার পরেও সেখানে থাকবে setStateInDepth({test: {one: {$set: 'new-value'}}})। প্রতিক্রিয়াটির সীমিত setStateক্রিয়াকলাপটি পেতে আমি এই কোডটি আমার সমস্ত উপাদানগুলিতে ব্যবহার করি ।
ডোরিয়ান

1
আমি সমাধান খুঁজে পেয়েছি। আমি this.state.testএকটি অ্যারে হিসাবে শুরু । অবজেক্টে পরিবর্তন করা, এটি সমাধান করা।
mamruoc

2

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

মোড়কের ক্লাসটি তার কনস্ট্রাক্টর হিসাবে একটি ফাংশন নেয় যা মূল উপাদান রাষ্ট্রের উপর একটি সম্পত্তি সেট করে।

export default class StateWrapper {

    constructor(setState, initialProps = []) {
        this.setState = props => {
            this.state = {...this.state, ...props}
            setState(this.state)
        }
        this.props = initialProps
    }

    render() {
        return(<div>render() not defined</div>)
    }

    component = props => {
        this.props = {...this.props, ...props}
        return this.render()
    }
}

তারপরে উপরের রাজ্যের প্রতিটি জটিল সম্পত্তির জন্য, আমি একটি স্টেট র্যাপড ক্লাস তৈরি করি। আপনি এখানে কন্সট্রাক্টরে ডিফল্ট প্রপস সেট করতে পারেন এবং ক্লাসটি শুরু করা হলে সেগুলি সেট করা হবে, আপনি মানগুলির জন্য স্থানীয় রাষ্ট্রটি উল্লেখ করতে পারেন এবং স্থানীয় রাষ্ট্র নির্ধারণ করতে পারেন, স্থানীয় ফাংশনগুলি উল্লেখ করতে পারেন, এবং এটি শৃঙ্খলা পেরিয়ে যেতে পারেন:

class WrappedFoo extends StateWrapper {

    constructor(...props) { 
        super(...props)
        this.state = {foo: "bar"}
    }

    render = () => <div onClick={this.props.onClick||this.onClick}>{this.state.foo}</div>

    onClick = () => this.setState({foo: "baz"})


}

সুতরাং আমার শীর্ষ স্তরের উপাদানটির কেবল প্রতিটি শ্রেণিকে এটি শীর্ষ স্তরের রাষ্ট্রীয় সম্পত্তি, একটি সরল রেন্ডার এবং ক্রস-উপাদানকে যোগাযোগ করে এমন কোনও ফাংশন সেট করার জন্য কনস্ট্রাক্টর দরকার।

class TopComponent extends React.Component {

    constructor(...props) {
        super(...props)

        this.foo = new WrappedFoo(
            props => this.setState({
                fooProps: props
            }) 
        )

        this.foo2 = new WrappedFoo(
            props => this.setState({
                foo2Props: props
            }) 
        )

        this.state = {
            fooProps: this.foo.state,
            foo2Props: this.foo.state,
        }

    }

    render() {
        return(
            <div>
                <this.foo.component onClick={this.onClickFoo} />
                <this.foo2.component />
            </div>
        )
    }

    onClickFoo = () => this.foo2.setState({foo: "foo changed foo2!"})
}

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


2

এই এখনকার মতো,

যদি পরবর্তী রাজ্যটি পূর্বের রাজ্যের উপর নির্ভর করে তবে আমরা পরিবর্তে আপডেটকারী ফাংশন ফর্মটি ব্যবহার করার পরামর্শ দিই:

ডকুমেন্টেশন অনুসারে https://reactjs.org/docs/react-component.html#setstate :

this.setState((prevState) => {
    return {quantity: prevState.quantity + 1};
});

অন্যান্য উত্তর থেকে অনুপস্থিত উদ্ধৃতি / লিঙ্কের জন্য ধন্যবাদ।
ম্যাডব্রেকস

1

সমাধান

সম্পাদনা: এই সমাধানটি স্প্রেড সিনট্যাক্স ব্যবহার করতে ব্যবহৃত হয় । লক্ষ্যটি কোনও বিষয়বস্তু উল্লেখ ছাড়াই একটি বিষয় তৈরি করা হয়েছিল prevState, যাতে এটি prevStateসংশোধন করা যায় না। তবে আমার ব্যবহারে, prevStateকখনও কখনও পরিবর্তিত হতে পারে। সুতরাং, পার্শ্ব প্রতিক্রিয়া ছাড়াই নিখুঁত ক্লোনিংয়ের জন্য, আমরা এখন prevStateJSON এ রূপান্তর করি এবং তারপরে আবার ফিরে আসি। (জেএসএন ব্যবহার করার অনুপ্রেরণা এমডিএন থেকে এসেছে ))

মনে রাখবেন:

ধাপ

  1. একটি অনুলিপি তৈরি করুন রুট-লেভেল সম্পত্তি এরstate যা আপনি পরিবর্তন করতে চান
  2. এই নতুন অবজেক্টটিকে মিউটেট করুন
  3. একটি আপডেট অবজেক্ট তৈরি করুন
  4. আপডেটটি ফিরিয়ে দিন

পদক্ষেপ 3 এবং 4 এক লাইনে একত্রিত করা যেতে পারে।

উদাহরণ

this.setState(prevState => {
    var newSelected = JSON.parse(JSON.stringify(prevState.selected)) //1
    newSelected.name = 'Barfoo'; //2
    var update = { selected: newSelected }; //3
    return update; //4
});

সরলীকৃত উদাহরণ:

this.setState(prevState => {
    var selected = JSON.parse(JSON.stringify(prevState.selected)) //1
    selected.name = 'Barfoo'; //2
    return { selected }; //3, 4
});

এটি দুর্দান্তভাবে প্রতিক্রিয়া নির্দেশিকা অনুসরণ করে। একই প্রশ্নের উত্তরে এক্সেলের উত্তরের ভিত্তিতে ।


1

ES6 সমাধান

আমরা প্রাথমিকভাবে রাজ্য সেট

this.setState({ selected: { id: 1, name: 'Foobar' } }); 
//this.state: { selected: { id: 1, name: 'Foobar' } }

আমরা রাষ্ট্রের অবজেক্টের কিছু স্তরে একটি সম্পত্তি পরিবর্তন করছি:

const { selected: _selected } = this.state
const  selected = { ..._selected, name: 'Barfoo' }
this.setState({selected})
//this.state: { selected: { id: 1, name: 'Barfoo' } }

0

প্রতিক্রিয়া স্থিতি পুনরাবৃত্ত মার্জটি সম্পাদন করে না setState আশা করে যে একই সময়ে স্থানে থাকা রাষ্ট্র সদস্য আপডেটগুলি থাকবে না। আপনি নিজেই বদ্ধ বস্তু / অ্যারে নিজেকে অনুলিপি করতে হবে (অ্যারে.স্লাইস বা অবজেক্ট.স্যাসাইন সহ) বা নিবেদিত লাইব্রেরিটি ব্যবহার করতে হবে।

এটার মত. নেস্টেডলিংক সরাসরি যৌগিক প্রতিক্রিয়া স্থিতি পরিচালনা করার পক্ষে সমর্থন করে।

this.linkAt( 'selected' ).at( 'name' ).set( 'Barfoo' );

এছাড়াও, selectedবা এর লিঙ্কটি selected.nameএকক প্রপ হিসাবে সর্বত্র পাস করা যেতে পারে এবং এর সাথে সেখানে পরিবর্তন করা যেতে পারে set


-2

আপনি কি প্রাথমিক অবস্থা স্থির করেছেন?

আমি উদাহরণস্বরূপ আমার নিজস্ব কিছু কোড ব্যবহার করব:

    getInitialState: function () {
        return {
            dragPosition: {
                top  : 0,
                left : 0
            },
            editValue : "",
            dragging  : false,
            editing   : false
        };
    }

যে অ্যাপ্লিকেশনটিতে আমি কাজ করছি তার মধ্যে আমি স্থিতি নির্ধারণ করে এবং ব্যবহার করে চলেছি। আমি setStateআপনার উপর বিশ্বাস করি তবে আপনি স্বতন্ত্রভাবে যা চান রাজ্যগুলি সম্পাদনা করতে পারবেন আমি একে এ জাতীয়ভাবে বলেছি:

    onChange: function (event) {
        event.preventDefault();
        event.stopPropagation();
        this.setState({editValue: event.target.value});
    },

মনে রাখবেন React.createClassযে আপনি যে ফাংশনটি বলেছেন তার মধ্যে আপনাকে রাষ্ট্রটি সেট করতে হবেgetInitialState


1
আপনি আপনার উপাদানটিতে কী মিশ্রণটি ব্যবহার করছেন? এটি আমার পক্ষে কাজ করে না
শচিন 21

-3

আমি পরিবর্তন করতে tmp var ব্যবহার করি।

changeTheme(v) {
    let tmp = this.state.tableData
    tmp.theme = v
    this.setState({
        tableData : tmp
    })
}

2
এখানে tmp.theme = v হল রূপান্তরকারী অবস্থা state সুতরাং এটি প্রস্তাবিত উপায় নয়।
almoraleslopez

1
let original = {a:1}; let tmp = original; tmp.a = 5; // original is now === Object {a: 5} এটি আপনাকে সমস্যা না দিলেও এটি করবেন না।
ক্রিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.