השוואת פתרונות תרגול תקשורת

תרגיל 1.
הגעתי לפתרון שאני לא כל כך מרוצה מימנו.
הערונת, הכתובת היא עם HTTPS ולא HTTP.
שאלה, האם ניתן לעבוד ב CODEPAN עם async \ await? קבלתי שגיאת ולא ידעתי איך להוסיף את הרפרנסים הרלוונטיים.

מה שאני לא אוהב בפתרון ועדיין לא התגברתי עליו, זה שאם אני מבצע את GET כבר ב CTOR הראשון, אז משום מה ה CTOR מופעל פעמיים ואני מקבל שגיאות.`

class DataPresentation extends React.Component
{
  
  click = (e) => {
    this.props.selectAttribute(e);
  }
  
  render() 
  {    
    if (this.props.data == undefined) return <div/>;
    
    const attributes = this.props.data[this.props.childAttribute].map((data,index) => 
      <AttributeLink key={index} name={data} clicked={this.click} />);
    
    return <span>
              <div>{this.props.data[this.props.displayAttribute]}</div>
              <div>{attributes}</div>
           </span>;
  }
}

function AttributeLink(props)
    {
      return <div>
      <button onClick={(e) => props.clicked(props.name)}>{props.name}</button>
    </div>
    }
   
class App extends React.Component
{     
  
  constructor(props)        
  {
    super(props); 

    const firstPerson = this.getFirstPerson();
    //getData('https://swapi.co/api/people/1/');
    this.state = {presentedData : firstPerson,
                  isPerson:true};

  }    

  selectAttribute = (url) => {
    this.getData(url);
  }
    
  getData = (url) => {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', url);
    xhr.addEventListener('load', () => {
      const results = JSON.parse(xhr.responseText);      
      this.setState(oldstate => ({presentedData: results,
                                 isPerson: !oldstate.isPerson}));
    });
    
    xhr.send();
  }
  
  render()
  {         
    return <div>
              <DataPresentation 
                data={this.state.presentedData} 
                childAttribute={this.state.isPerson ? 'films' : 'characters'} 
                displayAttribute={this.state.isPerson ? 'name' : 'title'} 
                selectAttribute={this.selectAttribute} />
           </div>;
  }
  
  /*
  getPerson = async () => {
    const res = await $.getJSON('http://swapi.co/api/people/1/');
    
    this.stateState(oldState => ({person : res.Search}));
  }
  */

 getFirstPerson = () => {
   return {
    "name": "Luke Skywalker", 
    "height": "172", 
    "mass": "77", 
    "hair_color": "blond", 
    "skin_color": "fair", 
    "eye_color": "blue", 
    "birth_year": "19BBY", 
    "gender": "male", 
    "homeworld": "https://swapi.co/api/planets/1/", 
    "films": [
        "https://swapi.co/api/films/2/", 
        "https://swapi.co/api/films/6/", 
        "https://swapi.co/api/films/3/", 
        "https://swapi.co/api/films/1/", 
        "https://swapi.co/api/films/7/"
    ], 
    "species": [
        "https://swapi.co/api/species/1/"
    ], 
    "vehicles": [
        "https://swapi.co/api/vehicles/14/", 
        "https://swapi.co/api/vehicles/30/"
    ], 
    "starships": [
        "https://swapi.co/api/starships/12/", 
        "https://swapi.co/api/starships/22/"
    ], 
    "created": "2014-12-09T13:50:51.644000Z", 
    "edited": "2014-12-20T21:17:56.891000Z", 
    "url": "https://swapi.co/api/people/1/"
};
 }
}

ReactDOM.render(<App />, document.getElementById('root'));

לא הפעלתי עדיין אצלי אבל מה שכתבת לגבי ה GET ב CTOR נשמע מוזר. איזה שגיאות? בלי קשר יש לך המון קומפוננטות. בתרגיל התבקשת במפורש לממש בסך הכל שני פקדים: Person ו Film.

נסה להתאים את זה למבנה של שני פקדים ואחרי זה נראה אם יש סיבה טובה לייצר מהם פקדי-עזר נוספים

למה הרבה פקדים?
יש לי שתי מחלקות ופונקציית עזר AttributeLink
יש לי רק שני פקדים והאמתי שאני דיי אוהב את הפתרון שלי, הוא דיי גנרי.

אני כרגע עובד עם CODEPEN אז אני לא יודע בדיוק מה השגיאה.
שאני מחליף את הפונקציה getData ב
getData = async (url) => {
const res = await $.getJSON(url);

this.stateState(oldState => ({person : res.Search}));

}
אז אפילו ה CTOR של APP לא מתחיל. אני משער שזה קשור לאחד מאלו:
import React from ‘react’;
import ReactDOM from ‘react-dom’;
import $ from ‘jquery’;

השגיאה:
"The above error occurred in the component:
in App

Consider adding an error boundary to your tree to customize error handling behavior.
Visit https://fb.me/react-error-boundaries to learn more about error boundaries."

הי,
קודפן לא עובד טוב עם import. שלח קישור לפן שיצרת ואנסה לראות ולעזור לגרום לו לעבוד.

לגבי המחלקות שלך - יש מספר בעיות:

  1. השאלה this.state.isPerson והטענה כאילו אם אתה לא Person אז אתה Film (ל Person יש name ול Film יש title). זה יישבר מהר מאוד כשנרצה להוסיף סוג מידע שלישי למערכת.

  2. אתה משתמש במחלקה DataPresentation כדי לייצג אנשים וגם סרטים. זה יישבר מהר מאוד כשנרצה ייצוג שונה לכל אחד משתי הישויות (למשל נרצה יותר מידע על סרטים או איזשהם כפתורים ליד אנשים שלא צריכים להיות בסרטים וכו׳)

בהשראת הפיתרון שלך כתבתי פוסט כאן ואני ממליץ לקרוא (יש שם התחלה של פיתרון שאני חושב שנותן יותר גמישות להמשך):

וגם שלח את הקודפן שאתה מנסה להפעיל ואנסה לעזור שם

לייק 1

בקשר לקישור בקודפן, פשוט תעתיק את הקוד שרשמתי אחד לאחד.

אני מסכים ש HigerObjectComponent זהו פיתרון עדיף.
השכלתי, תודה :slight_smile: