React中数据传输

React中数据传输

React中数据传输

父组件传递给子组件

概述:React中主要使用组件进行数据传输,组件的数据存储在props和state中,进行**自上而下**单向数据传递。

props

React核心思想:组件化,页面被切成一个个可以复用的独立的组件。每个组件是一个内部封闭的环境,类似于一个函数,props就是传入的参数。

1.用法

在父组件中,render 中就是调用子函数的过程,并把实际参数传入。在子组件中,需要使用props作为形式参数,传递父组件传入的参数。

//父组件
import Item from "./item";
export default class ItemList extends       React.Component{
  const itemList = data.map(item => <Item item=item />);
  render(){
    return (
      { itemList }
    );
  }
}
//map 函数返回每一项都是<Item item="数据">的数组

// 子组件
export default class Item extends React.Component{
  render{
    return (
      <li>{this.props.item}</li>
    )
  }
}
// this.props获取到组件的所有数据(是一个对象,包括这个组件的配置)根据父组件,现在只有item = item 属性,所有直接获取this.props.item即可获得全部数据。

2.只读性不变性

props用于**初始化状态和渲染组件**两个功能。所以当组件实例化以后,props是不能改变的。只有通过父组件重新渲染的方式才能将新的props传入子组件中。(子组件中无法对this.props进行修改)。props类似于从上面传来的常量。

3.默认参数和数据类型

Item.defaultProps = {
    item: "React Seafile"
}
// 默认参数
Item.propTypes = {
    item: PropTypes.string
}
// 默认数据类型:字符串(或者其他数据类型)
State

state: state is similar to props, but it is private and fully controlled by the component.

State是与props相同点都是数据(参数),但是state是子组件私有的变量,而且由子组件完全控制。

1.用法

export default class ItemList extends React.Component{
  constructor(){
    super();
    this.state = {
      itemList:true
    }
  }
  //我们会通过异步操作获取数据,需要在didMount阶段执行异步操作
  componentDidMount(){
    fetch("url").then((response) => response.json()).then((data) => {
      this.setState({
        itemList:item
      });
    })
  }
  render{
    return (
      { this.state.itemList }
    )
  }
}

重要提示当我们调用this.setState的方法时React会更新组件的数据状态state并且会重新调用render方法会对组件进行重新渲染

constructor是唯一初始化state的地方this.state来初始化statethis.setState一种方法修改state参数

总结state用于组件存储自己的属性和状态不能通过父组件访问可以传给子组件只能通过this.setState来修改~~修改state属性会导致组件重新渲染~~

  没有state叫做无状态组件有state叫做有状态组件
多用props少用stateprops可以逐层向下传递

React中的同一个组件内部标签条件渲染不需要设置某个标签的show-hide属性直接使用JSX中的三目计算进行渲染
{条件(属性==true)?<Form1/>:null} 

//fetch 新的请求方法(兼容性)——附加
fetch(url, options).then(function(response){
  //handle http response
},function(error){
  //handle network error
})

options 可选参数(是一个对象)包括对于请求的设置
{
  method:"POST",
    body:JSON.stringity(data)
}
包括
请求方法POST-GET
请求头信息header对象
请求体信息bodyBlobFormData等

相应response是一个Promise对象

Promise对象属性
status请求参数结果200
statustext:服务器返回的状态报文
headers:返回的头部信息
url请求的地址

Promise对象方法
text以string形式生成请求text
json() 生成JOSN.parse(responseText)的结果
blob() 生成一个Blob
arrayBuffer() 生成一个ArrayBuffer
formData() 生成格式化的数据 可用于其他的请求

参考文件JavaScript利用fetch实现异步请求的方法案例

子组件传递给父组件

回调函数

当子组件的状态发生变化时,可以用户触发或者JS触发回调函数,把子组件的信息通过回调函数返回父组件,之后父组件处理并setState。这是常用的方法。

事件监听

如果子组件很多或者层级很深,那么底层子组件的回调函数会依次上传,或者需要处理多个事件,那么回调函数不适合处理。所以使用事件监听(eg eventbus)任何位置的子组件触发事件,在顶级组件或者指定组件监听事件,统一处理,然后统一设置状态,这样更好管理组件。大型项目中更合适。

Ref

上面两种方式适应于子组件发出信号,然后父组件被动接收。如果父组件向主动获取子组件的信息,需要通过 ref 访问子组件的 DOM 属性状态。子组件中设置 ref={(node) => {this.ref = node}} 把子组件通过ref传出去。父组件中使用 ref 属性可以获取子组件(高阶组件中不能直接获取ref,需要转换)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值