第四章:组件之间的通讯
来源:互联网 发布:共享 网络打印机 运行 编辑:程序博客网 时间:2024/05/28 23:11
一、react
组件之间的通讯主要有
- 1、父组件到子组件
- 2、子组件到父组件
- 3、相邻组件
- 4、不相关的两个组件
二、父组件到子组件(常见)
父组件传递参数到子组件在开发中比较常见,
react
提供了一个props
来进行传递
1、定义子组件
**ListItem.tsx**import * as React from 'react';//定义一个接口规范外面传递进来的参数类型export interface Props { val:string}//定义一个接口规范state的类型export interface myState {}export default class ListItem extends React.Component<Props,myState> { render() { const {val} = this.props; return ( <li> <span>{val}</span> </li> ); } constructor(props: Props) { super(props); }}
2、定义父组件
**List.tsx**import * as React from 'react';import ListItem from "./ListItem";//定义一个接口规范外面传递进来的参数类型export interface Props { listName:string[]}//定义一个接口规范state的类型export interface myState {}export default class List extends React.Component<Props,myState> { render() { const {listName} = this.props; return ( <ul> { listName.map((val,index)=>{ return <ListItem key={`list-${index}`} val={val}/> }) } </ul> ); } constructor(props: Props) { super(props); }}
3、入口文件
**index.tsx**import * as React from 'react';import * as ReactDOM from 'react-dom';import registerServiceWorker from './registerServiceWorker';import './index.css';import List from "./List";const listName:string[] = ['张三','李四','王五'];ReactDOM.render( <List listName={listName}/>, document.getElementById('root') as HTMLElement);registerServiceWorker();
三、子组件传递参数到父组件
子组件传递参数到父组件,借用父组件传递参数到子组件的原理,只是在父组件定义一个方法传递到子组件
1、定义子组件
**ListItem1.tsx**import * as React from 'react';//定义一个接口规范外面传递进来的参数类型 export interface Props { checked:boolean, onChange:any, value:string}//定义一个接口规范state的类型export interface myState {}export default class ListItem1 extends React.Component<Props,myState> { render() { const {checked,onChange,value} = this.props; return ( <li> <label> <input type="checkbox" checked={checked} onChange={onChange}/>{value} </label> </li> ); } constructor(props: Props) { super(props); }}
3、定义父组件
**List1.tsx**import * as React from 'react';import ListItem1 from "./ListItem1";//定义一个接口规范外面传递进来的参数类型 export interface Props { list: any[]}//定义一个接口规范state的类型export interface myState { stateList: any[]}export default class List1 extends React.Component<Props,myState> { render() { const {stateList} = this.state return ( <ul> { stateList.map((val, index) => { return <ListItem1 checked={val.checked} onChange={this.onItemChange.bind(this, val)} value={val.value} key={`list-${index}`}/> }) } </ul> ); } onItemChange(val:any){ console.log(val); let result = this.state.stateList.map((v, i)=>{ if (v.value == val.value){ v.checked = !val.checked } return this.state; }) this.setState({ stateList:result[0].stateList }); } constructor(props: Props) { super(props); this.state = { stateList:this.props.list } }}
3、主文件入口
import * as React from 'react';import * as ReactDOM from 'react-dom';import registerServiceWorker from './registerServiceWorker';import './index.css';import List1 from "./List1";const list:object[] = [ { 'checked':true, 'value':'选项一' }, { 'checked':false, 'value':'选项二' }]ReactDOM.render( <List1 list={list}/>, document.getElementById('root') as HTMLElement);registerServiceWorker();
四、两个相邻的组件之间传递数据
这种关系通常做法是依赖他们共同的父容器
1、定义组件A
import * as React from 'react';import * as ReactDOM from 'react-dom';//定义一个接口规范外面传递进来的参数类型 export interface Props { setValue:any}//定义一个接口规范state的类型export interface myState {}export default class ListItem21 extends React.Component<Props,myState> { value:any; render() { return ( <div> <p>我是组件A</p> <input type="text" onChange={this.handleChange.bind(this)} ref="input-dom"/> <input type="button" onClick={this.handleClick.bind(this)} value="通知"/> </div> ); } handleChange(e:any){ this.value = e.target.value; } handleClick(){ const {setValue} = this.props; setValue(this.value); let myref = ReactDOM.findDOMNode<HTMLInputElement>(this.refs['input-dom']); myref.value = ''; } constructor(props: Props) { super(props); }}
2、定义组件B
import * as React from 'react';//定义一个接口规范外面传递进来的参数类型export interface Props { value:any}//定义一个接口规范state的类型export interface myState {}export default class ListItem22 extends React.Component<Props,myState> { render() { const {value} = this.props return ( <div> <p>我是组件B</p> <p>{value}</p> </div> ); } constructor(props: Props) { super(props); }}
3、定义他们的父组件
import * as React from 'react';import ListItem21 from "./ListItem21";import ListItem22 from "./ListItem22";//定义一个接口规范外面传递进来的参数类型 export interface Props {}//定义一个接口规范state的类型export interface myState { value:any}export default class List2 extends React.Component<Props,myState> { render() { return ( <div> <ListItem21 setValue={this.setValue.bind(this)}/> <hr/> <ListItem22 value={this.state.value}/> </div> ); } setValue(val:any){ console.log('接收子组件传递过来的参数:',val); this.setState({ 'value':val }) } constructor(props: Props) { super(props); this.state = { 'value':'' } }}
4、运行效果
五、使用上下文context
实现数据传递
如果几个不相关系的组件直接传递数据可以用上下文
context
,只是本人在typescript
开发react
中没有实现成功,谁实现了可以直接通知我
六、通用用法,使用redux
状态管理
七、代码见demo
阅读全文
0 0
- 第四章:组件之间的通讯
- android应用程序组件之间的通讯
- vue 兄弟组件之间的通讯
- # react中父子组件之间的通讯,一看就懂
- 【react】父子组件之间通讯props
- 进程之间的通讯
- ViewModel之间的通讯
- 应用之间的通讯
- fragment之间的通讯
- zebra之间的通讯
- Android应用的各项组件之间的通讯 - Intent的应用
- 第四章、ReactNative组件的封装
- 第四章 react组件
- QQ通讯组件的使用
- 两个swf之间的通讯
- VC++ 多线程之间的通讯
- 服务器通讯之间的问题
- 线程之间的通讯---SynchronizationContext
- android 动画 弹出动画 控件 布局 动画
- 参数一个以上的问题解决方法
- (3)选择器练习
- 创建一个继承父类的类
- Xamarin.Android开发入门——Hello,Android Multiscreen深入理解
- 第四章:组件之间的通讯
- C++与C语言的区别——C++是对C语言的扩展(二)——输入cin与输出cout
- PAT basic 1006
- sublime text 3配置java编译和运行环境,调用cmd
- windows服务器部署tomcat及项目
- 设置一个对象的属性
- C++11 多线程
- ios 调用系统功能打电话、发信息
- PAT basic 1007