上一篇博文简述了脚手架的使用,以及在ws中的简单配置,详细的配置方法就不讲了,可能有很多细节,在日常使用中发掘就好。然后是脚手架的项目结构以及之间的联系,这个完全可以自己找出来,再不济就百度一下就好。
今天记录一下组件之间的传值问题,特别是兄弟组件的传值,真的是为难了我好久的一个问题:
要做啥呢?:
方便兄弟组件中传值,我知道的实现方式有两种,一种是使用React Context,一种是 如图所示的传球:
组件结构图:
输入参数,点击查询,查询的input值传递给兄弟组件查询数据:
组件代码:
父组件:
import React,{Component} from 'react'; import Label from './Label'; import Search from './Search'; //组件传值可以使用 Context export default class ChatCir extends Component{ constructor(props){ super(props); this.state={ keyWord: '' } } //设置组件A input的查询参数 setKeyWorld = (keyWord) => { this.setState({ keyWord }) } render() { return ( <div> {/*组件A*/} <Search setKeyWorld={this.setKeyWorld} /> {/*组件B*/} <Label keyWordValue={this.state.keyWord}/> </div> ); } }
组件A:
import React,{Component} from 'react'; export default class Search extends Component{ constructor(props){ super(props); this.state={ currentKeyValue: '' } } setCurrentKeyValue= (e) => { const currentKeyValue = e.target.value this.setState({ currentKeyValue }) } //点击查询按钮,将值传给父组件 search = () =>{ this.props.setKeyWorld(this.state.currentKeyValue); } render() { return ( <div> <input type="text" value={this.state.currentKeyValue} onChange={this.setCurrentKeyValue}/> <button onClick={this.search}>查询</button> </div> ); } }
组件B:
import React,{Component} from 'react'; import axios from 'axios'; //项目目录执行 //npm isntall axios --save //npm i -S axios export default class Label extends Component{ constructor(props){ super(props); this.state={ key: '', UserList: [] } } //props将要被改变前执行 componentWillReceiveProps(props){ const key=props.keyWordValue; console.log('key',key) this.setState({key}); //ajax请求接口 axios.get('https://api.github.com/search/users?q='+key) .then(response=>{ const {items} = response.data; console.log(items) this.setState({UserList: items}) }) .catch( error=> { console.log(error); }) } render() { const UserList=this.state.UserList; // 遍历列表数据 return UserList.map((value,index)=> ( <div style={{ 110, height:160,float:'left'}}> <img style={{ 100, height:100}} src={value.avatar_url} alt=""/> <p>用户Id:{value.login}</p> </div> )); } }