reactjs tutorial رد المكون الفرعي غير التحديث بعد تغيير حالة الأصل




react js شرح (2)

هناك مشكلتان في الكود.

تم تعيين الحالة الأولية للمكون التابع لك من الدعائم.

this.state = {
  data: props.data
};

نقلا عن هذا الجواب :

يمثل تمرير الحالة الأولية إلى أحد المكونات كمادة prop نمطًا مضادًا لأن أسلوب getInitialState (في حالتنا ، getInitialState ) يسمى فقط في المرة الأولى التي يتم فيها تقديم المكون. أبدا أكثر من ذلك. بمعنى أنه إذا قمت بإعادة تقديم هذا المكون بتمرير قيمة مختلفة prop ، فلن يتفاعل المكون وفقًا لذلك ، لأن المكون سوف يحافظ على الحالة من أول مرة يتم تقديمها. انها عرضة للخطأ جدا.

لذلك إذا كنت لا تستطيع تجنب مثل هذا الموقف ، فإن الحل الأمثل هو استخدام componentWillReceiveProps الأسلوب componentWillReceiveProps للاستماع إلى الدعائم الجديدة.

ستؤدي إضافة الرمز أدناه إلى المكون الفرعي إلى حل مشكلتك في إعادة تقديم المكون الفرعي.

componentWillReceiveProps(nextProps) {
  this.setState({ data: nextProps.data });  
}

المسألة الثانية هي مع fetch .

_makeApiCall(endpoint) {
  fetch(endpoint)
    .then((response) => response.json())   // ----> you missed this part
    .then((response) => this.setState({ response }));
}

وهنا تكمن العامل: https://jsfiddle.net/o8b04mLy/

أحاول إنشاء مكون ApiWrapper جميل لتعبئة البيانات في مختلف المكونات الفرعية. من كل ما قرأته ، يجب أن يعمل هذا: https://jsfiddle.net/vinniejames/m1mesp6z/1/

class ApiWrapper extends React.Component {

  constructor(props) {
    super(props);

    this.state = {
      response: {
        "title": 'nothing fetched yet'
      }
    };
  }

  componentDidMount() {
    this._makeApiCall(this.props.endpoint);
  }

  _makeApiCall(endpoint) {
    fetch(endpoint).then(function(response) {
      this.setState({
        response: response
      });
    }.bind(this))
  }

  render() {
    return <Child data = {
      this.state.response
    }
    />;
  }
}

class Child extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      data: props.data
    };
  }

  render() {
    console.log(this.state.data, 'new data');
    return ( < span > {
      this.state.data.title
    } < /span>);
  };
}

var element = < ApiWrapper endpoint = "https://jsonplaceholder.typicode.com/posts/1" / > ;

ReactDOM.render(
  element,
  document.getElementById('container')
);

ولكن لسبب ما ، يبدو أن المكون الفرعي لا يتم تحديثه عندما تتغير الحالة الأصل.

نسيت شيئا ما هنا؟


Answer #1

هناك بعض الأشياء التي تحتاج إلى تغيير.

عندما fetch الحصول على الاستجابة ، فإنه ليس json. كنت أبحث عن كيف يمكنني الحصول على هذا json واكتشفت هذا link .

على الجانب الآخر ، تحتاج إلى التفكير في أن وظيفة constructor تسمى مرة واحدة فقط.

لذلك ، تحتاج إلى تغيير الطريقة التي تسترجع بها البيانات في مكون <Child> .

هنا ، تركت رمز مثال: https://jsfiddle.net/emq1ztqj/

أتمنى أن يساعد ذلك.





reactjs