react组件之间的通信
通过props传递
共同的数据放在父组件上, 特有的数据放在自己组件内部(state),通过props可以传递一般数据和函数数据, 只能一层一层传递
一般数据-->父组件传递数据给子组件-->子组件读取数据
函数数据-->子组件传递数据给父组件-->子组件调用函数(相当于vue当中的自定义事件)
案例在:react中使用Ajax请求(axios,Fetch)在这篇文章的分别使用axios和fetch实现一个搜索案例中就有
使用消息订阅(subscribe)-发布(publish)机制
PubSubJS可以用在任何关系的组件中,如果传递的参数有多个就封装成对象
工具库: PubSubJS。下载: npm install pubsub-js --save
在需要的组件中引入:import PubSub from 'pubsub-js'
PubSub.subscribe('delete', function(data){ }); //订阅
PubSub.publish('delete', data) //发布消息
还是拿react中使用Ajax请求(axios,Fetch)在这篇文章的分别使用axios和fetch实现一个搜索的案例来修改
父组件中什么都不用做,只负责引入两个子组件search-list和search-input
import React, {Component} from 'react'
import './search.css';
import SearchInput from './search-input/search-input'
import SearchList from './search-list/search-list'
class Search extends Component {
render() {
return (
<div className='search-axios'>
<div className='search-input-cantain'>
<SearchInput/>
</div>
<div className='search-list-cantain'>
<SearchList />
</div>
</div>
)
}
}
export default Search
消息发布写在发送数据的组件中,比如这个案例中发送数据的是search-input这个组件
import React, {Component} from 'react'
import './search-input.css';
import PubSub from 'pubsub-js'
class SearchInput extends Component {
handleSearch = () => {
// 获取输入框中的数据
const searchName = this.searchName.value
// 使用PubSub发布消息,第一个参数是消息名,第二个参数是这个消息的值
if (searchName) {
PubSub.publish('search', searchName)
}
// 清空输入框中的数据
this.searchName.value = ''
}
render() {
return (
<div className='search-input'>
<input type='text' ref={input => this.searchName = input} placeholder='enter the name you search'/>
<button onClick={this.handleSearch}>Search</button>
</div>
)
}
}
export default SearchInput
消息订阅写在接收消息的组件中(search-list),订阅消息写在组件的componentDidMount(初始化已经挂载)周期函数中
import React, {Component} from 'react'
import './search-list.css';
import PubSub from 'pubsub-js'
import axios from 'axios'
class SearchList extends Component {
state = {
initView: true,
loading: false,
users: [],
errorMsg: null
}
// 在此方法中启动定时器/绑定监听/发送ajax请求
async componentDidMount () {
PubSub.subscribe('search', (msg, searchName) => {
// 这个回调函数必须有两个参数,第一个是消息名,第二个是订阅的消息的值
const url = `https://api.github.com/search/users?q=${searchName}`
this.setState({ initView: false, loading: true })
axios.get(url)
.then((response) => {
this.setState({ loading: false, users: response.data.items })
})
.catch((error) => {
console.log('error', error.response.data.message, error.message)
this.setState({ loading: false, errorMsg: error.message })
})
});
}
render() {
const {initView, loading, users, errorMsg} = this.state
if (initView) {
return <div className='search-hide-enter'>enter the name you search</div>
} else if (loading) {
return <div className='search-ing'>搜索中,请稍后.....</div>
} else if (errorMsg) {
return <div className='search-error'>{errorMsg}</div>
} else {
return (
<div className='search-list'>
{users.map((user, index) => (
<div className='search-item' key={index}>
<div className='search-item-img'><img src={user.avatar_url} alt='user'/></div>
<p className='search-item-name'>{user.login}</p>
</div>
))}
</div>
)
}
}
}
export default SearchList
redux
react组件之间的通信的更多相关文章
- 使用reflux进行react组件之间的通信
前言 组件之间为什么要通信?因为有依赖. 那么,作为React组件,怎么通信? React官网说, 进行 父-子 通信,可以直接pass props. 进行 子-父 通信,往父组件传给子组件的函数注入 ...
- react 组件之间的通信
react推崇的是单向数据流,自上而下进行数据的传递,但是由下而上或者不在一条数据流上的组件之间的通信就会变的复杂.解决通信问题的方法很多,如果只是父子级关系,父级可以将一个回调函数当作属性传递给子级 ...
- 关于react组件之间的通信
才开始学react刚好到组件通信这一块,就简单的记录下组件间的通信方式:父到子:props.context,子到父:自定义事件.回调,兄弟组件:共父props传递.自定义事件import React, ...
- react native 之子组件和父组件之间的通信
react native开发中,为了封装性经常需要自定义组件,这样就会出现父组件和子组件,那么怎么在父组件和子组件之间相互通信呢,也就是怎么在各自界面push和pop.传值. 父组件传递给子组件: 父 ...
- React 学习(六) ---- 父子组件之间的通信
当有多个组件需要共享状态的时候,这就需要把状态放到这些组件共有的父组件中,相应地,这些组件就变成了子组件,从而涉及到父子组件之间的通信.父组件通过props 给子组件传递数据,子组件则是通过调用父组件 ...
- react组件之间的几种通信情况
组件之间的几种通信情况 父组件向子组件通信 子组件向父组件通信 跨级组件通信 没有嵌套关系组件之间的通信 1,父组件向子组件传递 React数据流动是单向的,父组件向子组件通信也是最常见的;父组件通过 ...
- react第十七单元(redux和组件之间的通信,react-redux的相关api的用法)
第十七单元(redux和组件之间的通信,react-redux的相关api的用法) #课程目标 什么是redux-redux react-redux的作用是什么 react-redux如何应用 #知识 ...
- React 组件之间通信 All in One
React 组件之间通信 All in One 组件间通信 1. 父子组件之间通信 props 2. 兄弟组件之间通信 3. 跨多层级的组件之间通信 Context API https://react ...
- react 实现组件嵌套以及子组件与父组件之间的通信
当子组件触发onChange事件时,实际调用的是父组件中的handelSelect函数,通俗来说就是父组件通过属性handleSelect实现与子组件之间的通信. 父组件:SignupForm 子组件 ...
随机推荐
- 初探设计模式5:Spring涉及到的9种设计模式
设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆. 今天,螃蟹在IT学习者网站就设计模式的内在价值做一番探讨,并以spring为例进行讲解,只有领略了 ...
- 程序员过关斩将--面试官再问你Http请求过程,怼回去!
菜菜哥,X总在产品部瞎指挥,作为程序媛的我都快撑不住了 不光你撑不住了,大家都要撑不住了,外行人指导内行人,呵呵 前天我偷偷的去面试了,结果挂了 出去转转其实是好事,面试官问你什么了? 他让我描述一个 ...
- Numpy 基础学习
numpy.array() 功能:创建一个数据 vector = numpy.array([1,2,3,4]) matrix = numpy.array([1,2,3,4],[11,12,13,14] ...
- C语言数组操作和指针操作谁更高效
在上一篇博文 代码优化小技巧(持续更新......) 第三条关于数组和指针谁更高效, 意犹未尽, 决定单独拉出一篇来讲 1. 数组和指针操作对比 #include <stdio.h> i ...
- 【c#】RabbitMQ学习文档(二)Work Queues(工作队列)
今天开始RabbitMQ教程的第二讲,废话不多说,直接进入话题. (使用.NET 客户端 进行事例演示) 在第一个教程中,我们编写了一个从命名队列中发送和接收消息的程序. ...
- iOS逆向开发(6):微信伪造位置
仍然以微信为例,实战地练习一下使用Reveal.iOSOpenDev等工具注入APP的流程,积累经验.这一系列的文章都是学习过程的总结,不带任何商业目的. 本文解决一个问题:如何伪造一个经纬度,在微信 ...
- Docker最全教程——从理论到实战(二)
上篇内容链接: https://www.cnblogs.com/codelove/p/10030439.html Docker和ASP.NET Core Docker 正在逐渐成为容器行业的事实标准, ...
- windows powershell一些操作
- SpringBoot系列——Spring-Data-JPA
前言 jpa是ORM映射框架,更多详情,请戳:apring-data-jpa官网:http://spring.io/projects/spring-data-jpa,以及一篇优秀的博客:https:/ ...
- 【转】java缩放图片、java裁剪图片代码工具类
一首先看下效果 二工具类 三测试类 在系统的上传图片功能中,我们无法控制用户上传图片的大小,用户可能会上传大到几十M小到1k的的图片,一方面图片太大占据了太多的空间,另一方面,我们没办法在页面上显示统 ...