Correct --> Search GitHub

Axios

by Allie Yu

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.13.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.13.1/umd/react-dom.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.19.2/axios.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pubsub-js/1.8.0/pubsub.min.js"></script>
<div id="root"></div>

Babel + JSX

//Sibling pass state
class Item extends React.Component {
    render() {
        let {user} = this.props;
        return (
            <React.Fragment>
                <a href={user.userRepoUrl}>
                  <img src={user.userAvatarUrl} alt={user.userName} />
                </a>
                <p>{user.userName}</p>
            </React.Fragment>
        )
    }
}

class List extends React.Component {
	state = {
  	isFirst: true,
    isLoading: false,
    users: [],
    errMsg: ''
  }
  
  //newState can be destruct as {isFirst, isLoading, users, errMsg}
  componentDidMount(){
    PubSub.subscribe('updateListState', (msg,newState) => {
    	this.setState({
      	isFirst, isLoading, users, errMsg
      })
    })
  }
  
  render() {
    let {isFirst, isLoading, users, errMsg} = this.state
    if (isFirst) {
      return <h2>Input keyword, click button</h2>
    } else if (isLoading) {
      return <h2>Loading...</h2>
    } else if (errMsg) {
      return <h2>{errMsg}</h2>
    } else {
      return (
        <div>
          {
            users.map(user => {
              return <Item key={user.userName} user={user} />
            })
          }
        </div>
      )
    }
  }
}

class Search extends React.Component {
	contentRef = React.createRef();

  search = () => {
    //1.get input
    let keyWord = this.contentRef.current.value.trim();
    //2.Send keyword content to List
    //	发布消息,让list更新状态
    PubSub.publish('updateListState', {
    	isFirst: false,
      isLoading: true,
      users: [],
      errMsg: ''
    })
    
  	//distruct {keyWord} from (newProps) : console.log(newProps);
    const url = `https://api.github.com/search/users?q=${keyWord}`
		try {
			let response = axios.get(url);
      let users = response.data.items.map(item => {
      	return {
        	userAvatarUrl: item.avatar_url,
          userRepoUrl: item.html_url,
          userName: item.login
        }
      })
      PubSub.publish('updateListState', {
        isFirst: false,
 ...