اذهب إلى المحتوى

السؤال

نشر

لدي كائن محفوظ في حالة المكون component state، وأريد أن أعرف هل من الممكن أن أقوم بتحديث خصائص كائن في حالة المكون بهذه الطريقة:

this.state = {person: { name: 'Adam', age: 22 }}

حاولت أن أجرب بنفسي الأكواد التالية:

// هذا السطر يسبب syntax error 
this.setState({person.name: 'Ahmed'});

// بينما هذا السطر لا يفعل شيء البتة
this.setState({person: {name: 'Ahmed'}})

هل يمكن فعل ذلك من الأساس أم يجب أن أغير بنية الكائن نفسه؟

Recommended Posts

  • 1
نشر

إذا كنت  تريد تغير ال state يجب أن تعطيها key مباشر وفي حالتك person وليس person.name وإذا أردت تحديث الإسم فقط وأن تبقي على ال age فأنت تحتاج ال prevState لتكون الطريقة كالآتي: 
 

this.state = {person: { name: 'Adam', age: 22 }}

// الطريقة 
this.setState(prevState => ({
	person: {
      ...prevState.person, // القيمة القديمة 
      name: 'Mohammed' // تعدل الإسم
    }
}));


 

  • 0
نشر

هل يمكنك أن ترينا كود Component ﻷن الطريقة اﻷخيرة يفترض أن تكون صحيحة؟ بالنسبة للإسناد إلى this.state فلا يجوز ذلك إلا في الباني وأي تعديل على this.state خارج الباني سيتجاهله الـReactJS ولن تعدل الواجهات وفقاً للتغيير. ذلك بأن this.state ليس متحولاً سحرياً بل هو مجرد object فكيف للـReactJS أن يعلم أنك عدلت عليه؟

بالنسبة لسؤال عن تغيير بنية الكائن فلا لا داعي لتغيير بنية الكائن وكما قلت لك الطريقة اﻷخيرة وهي التالية:

this.setState({person: {name: 'Ahmed'}})

صحيحة والمشكلة في الغالب في بقية كود Component الذي أرجو منك نشره لنحل المشكلة.

  • 0
نشر

لقد واجهت مشكلة مماثلة لمشكلتك سابقا لكن بتعقيد أكثر قليلا حيث واجهت تعديل state مماثل لهيكلة هذا

{
    user: { firsname: '', lastname: '' },
    cerdentials: { password: '', confirmPassword: '' },
}

الحل الأول الذي خطر على بالي هو أن أغير باستعمال دالتين

export default function App() {
  const [info, setInfo] = React.useState({
    user: { firsname: '', lastname: '' },
    cerdentials: { password: '', confirmPassword: '' },
  });

  const handleUserChange = (e) => {
    e.persist();
    setInfo((prevState) => ({
      ...prevState,
      user: {
        ...prevState.user,
        [e.target.name]: e.target.value,
      },
    }));
  };
  const handleCerdentailsChange = (e) => {
    e.persist();
    setInfo((prevState) => ({
      ...prevState,
      cerdentials: {
        ...prevState.cerdentials,
        [e.target.name]: e.target.value,
      },
    }));
  };

  console.log(info);

  return (
    <div>
      <input onChange={handleUserChange} type="text" name="firstname" />
      <input onChange={handleUserChange} type="text" name="lastname" />
      <input onChange={handleCerdentailsChange} type="password" name="password" />
      <input onChange={handleCerdentailsChange} type="password" name="confirmPassword" />
    </div>
  );
}

الحل يعمل لا مشكلة لكنه يفرض عليك أساليب في كتابة الشيفرة منافية لمبادئ البرمجة النظيفة فقررت أن أجد حل أخر وتوصلت الى هذا الحل بدالة واحدة 

export default function App() {
  const [info, setInfo] = React.useState({
    user: { firsname: '', lastname: '' },
    cerdentials: { password: '', confirmPassword: '' },
  });

  const handleChange = (e, key) => {
    e.persist();
    setInfo((prevState) => ({
      ...prevState,
      [key]: {
        ...prevState[key],
        [e.target.name]: e.target.value,
      },
    }));
  };
  console.log(info);

  return (
    <div>
      <input onChange={(e) => handleChange(e, 'user')} type="text" name="firstname" />
      <input onChange={(e) => handleChange(e, 'user')} type="text" name="lastname" />
      <input onChange={(e) => handleChange(e, 'cerdentials')} type="password" name="password" />
      <input
        onChange={(e) => handleChange(e, 'cerdentials')}
        type="password"
        name="confirmPassword"
      />
    </div>
  );
}

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...