关于react的几个网站:
http://react.css88.com/
小书:http://huziketang.mangojuice.top/books/react/
http://www.redux.org.cn/
组件传值的方法:
1.父子组件间的传值
2.context
3.子组件向父组件传值
4.没有任何嵌套关系的组件之间传值
5.redux
一、父子组件间的传值(主要是利用 props 来进行交流,父组件用this.state传值,子组件用this.prop):
如果组件嵌套层次太深,那么从外到内组件的交流成本就变得很高,通过 props 传递值的优势就不那么明显了。
Father.jsx文件
import React, {Component} from 'react'
import Son from './Son.jsx'
{/*引入子组件*/}
export default class Father extends Component{
constructor(){
super();
this.state = {
message: 'hello',
sonVal: null
}
}
render(){
return (
<div id="father">
<h1>Father组件</h1>
<button onClick={()=>{this.setState({message: 'world'})}}>
修改
</button>
{/* <Son data="test data value"/> */}
<p>选择了那种水果:{this.state.sonVal}</p>
<Son data={this.state.message} handle={this.testAction.bind(this)}/>
{/*子组件中传递参数或者方法*/}
</div>
)
}
// 接收子组件数据
testAction(value){
console.log(this);
console.log(value);
this.setState({sonVal: value});
}
}
Son.jsx
import React, {Component} from 'react'
export default class Son extends Component{
constructor(){
super();
this.state = {
select: '苹果'
}
}
render(){
let arr = ['苹果', '香蕉', '西瓜'];
return (
<div id="son">
<h1>Son组件</h1>
<p>接收到的值为:{this.props.data}</p>
{
arr.map((item, index)=>{
return (
<p key={index}>
{item}:
<input type="radio" value={item}
checked={this.state.select == item}
onChange={this.inputChange.bind(this)}/>
</p>
)
})
}
</div>
)
}
inputChange(ev){
let value = ev.target.value;
this.setState({select: value});
// 调用父组件的方法,将值传递给父组件
this.props.handle(value);
}
}
二.(父组件)向更深层的(子组件) 进行传递信息 >>利用(context)
通过添加 childContextTypes 和 getChildContext() 到 第一层组件MessageList ( context 的提供者),React 自动向下传递数据然后在组件中的任意组件(也就是说任意子组件,在此示例代码中也就是 Button )都能通过定义 contextTypes(必须指定context的数据类型) 访问 context 中的数据。这样就不需要通过第二层组件进行传递了。
指定数据并要将数据传递下去的父组件要定义 childContextTypes 和 getChildContext() ;想要接收到数据的子组件 必须定义 contextTypes 来使用传递过来的 context 。
var Button = React.createClass({
// 必须指定context的数据类型
contextTypes: {
color: React.PropTypes.string
},
render: function() {
return (
<button style={{background: this.context.color}}>
{this.props.children}
</button>
);
}
});
var Message = React.createClass({
render: function() {
return (
<div>
{this.props.text} <Button>Delete</Button>
</div>
);
}
});
var MessageList = React.createClass({
//父组件要定义 childContextTypes 和 getChildContext()
childContextTypes: {
color: React.PropTypes.string
},
getChildContext: function() {
return {color: "purple"};
},
render: function() {
var children = this.props.messages.map(function(message) {
return <Message text={message.text} />;
});
return <div>{children}</div>;
}
});
三、子组件向父组件传值
【子组件】控制自己的 state 然后告诉【父组件】的点击状态,然后在【父组件】中展示出来
// 父组件
var MyContainer = React.createClass({
getInitialState: function () {
return {
checked: false
};
},
onChildChanged: function (newState) {
this.setState({
checked: newState
});
},
render: function() {
var isChecked = this.state.checked ? 'yes' : 'no';
return (
<div>
<div>Are you checked: {isChecked}</div>
<ToggleButton text="Toggle me"
initialChecked={this.state.checked}
callbackParent={this.onChildChanged}
/>
</div>
);
}
});
// 子组件
var ToggleButton = React.createClass({
getInitialState: function () {
return {
checked: this.props.initialChecked
};
},
onTextChange: function () {
var newState = !this.state.checked;
this.setState({
checked: newState
});
// 这里要注意:setState 是一个异步方法,所以需要操作缓存的当前值
this.props.callbackParent(newState);
},
render: function () {
// 从【父组件】获取的值
var text = this.props.text;
// 组件自身的状态数据
var checked = this.state.checked;
return (
<label>{text}: <input type="checkbox" checked={checked}
onChange={this.onTextChange} /></label>
);
}
});
四、没有任何嵌套关系的组件之间传值(比如:兄弟组件之间传值)
推荐一个相关博客:https://blog.csdn.net/u011439689/article/details/51955991
ProductSelection和Product本身是没有嵌套关系的,而是兄弟层级的关系。但通过在ProductSelection组件中订阅一个消息,在Product组件中又发布了这个消息,使得两个组件又产生了联系,进行传递的信息。所以根据我个人的理解,当两个组件没有嵌套关系的时候,也要通过全局的一些事件等,让他们联系到一起,进而达到传递信息的目的。
One.jsx文件
import React, {Component} from 'react'
import PubSub from 'pubsub-js'
export default class One extends Component{
constructor(){
super();
console.log('constructor');
this.state = {
message: null
}
}
render(){
console.log('render');
return (
<div>
<h1>One组件</h1>
<p>接收到的值为:{this.state.message}</p>
</div>
)
}
// 创建并且渲染完成的方法
componentDidMount(){
console.log('componentDidMount');
//监听子组件的事件
this.token = PubSub.subscribe('send-data', (eventName, data)=>{
console.log('subscribe执行了');
console.log(data);
this.setState({message: data});
})
// $on
}
//组件将要销毁
componentWillUnmount(){
console.log('componentWillUnmount');
// 组件销毁时,需要移除监听
PubSub.unsubscribe(this.token);
// $off
}
}
Two.jxs
import React, {Component} from 'react'
import PubSub from 'pubsub-js'
export default class Two extends Component{
render(){
return (
<div>
<h1>Two组件</h1>
<input type="text" ref="in"/>
<button onClick={this.sendAction.bind(this)}>发送</button>
</div>
)
}
sendAction(){
// 发送信息给one组件
PubSub.publish('send-data', this.refs.in.value);
// $emit
}
}
五.利用react-redux进行组件之间的状态信息共享
如果是比较大型的项目,可以使用react-redux,这方面的资料可以参考阮一峰的网络日志。
http://github.com/mroderick/PubSubJS
- vue 和 react 组件间通信方法对比
vue 和 react 组件间通信方法对比: 通信路径 vue的方法 react的方法 父组件 => 子组件 props(推荐).slot(推荐).this.$refs.this.$childr ...
- React 组件间通讯
React 组件间通讯 说 React 组件间通讯之前,我们先来讨论一下 React 组件究竟有多少种层级间的关系.假设我们开发的项目是一个纯 React 的项目,那我们项目应该有如下类似的关系: 父 ...
- vue组件定义方式,vue父子组件间的传值
vue组件定义方式,vue父子组件间的传值 <!DOCTYPE html> <html lang="zh-cn"> <head> <met ...
- React 组件间通信介绍
React 组件间通信方式简介 React 组件间通信主要分为以下四种情况: 父组件向子组件通信 子组件向父组件通信 跨级组件之间通信 非嵌套组件间通信 下面对这四种情况分别进行介绍: 父组件向子 ...
- React 组件的生命周期方法
React 组件的生命周期方法 按渲染顺序: 1: componentWillMount() – 在渲染之前执行,在客户端和服务器端都会执行. 2: componentDidMount() – 仅在第 ...
- Vue—非父子组件间的传值(Bus/发布订阅模式/观察者模式/总线)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- React 组件间传值
壹 .了解React传值的数据 一. 创建组件的方法 一 . 1 通过function声明的组件特点是: 1)function创建的组件是没有state属性,而state属性决定它是不是有生命周期 ...
- react组件间传值详解
一.父子组件间传值 <1>父传子 父组件:
- React组件间通信
众所周知,ReactJS组件与组件之间的通信是一个难点.在React实际开发中,父子组件之间的传值是比较常见的,刚入门的小伙伴很容易被组件之间的通信绕懵. 今天花了点时间总结了一下React父子组件之 ...
随机推荐
- JOS环境搭建
想写一个OS很久了,今天开始正式动工了!! 大家都知道操作系统是计算机科学中十分重要的一门基础学科.但是以前在学习这门课时,仅仅只是把目光停留在课本上一些关于操作系统概念上的叙述,并不能对操作系统有着 ...
- Excel2010如何实现隔行设置背景色
当Excel表格中的数据很多,很有可能会出现看错行的现象,为防止看错行,可以隔行设置背景色.可以通过套用表格格式或者条件格式来达到隔行变色的效果 方法一:通过套用表格格式 1.选中要处理的单元格或者列 ...
- 解决 This application requires Java Runtime Environment XX
已经安装了 jdk ,并且设置好了 java 环境变量,CMD 运行 java 或 javac 都正常,其他依赖 jdk 的应用程序都能正常运行.但是在运行 jd-gui 1.1.0 的时候,出现错误 ...
- 性能测试学习第九天_脚本编写以及controller场景
创建java脚本 环境配置: 安装jdk(lr11最高支持java1.6) 配置环境变量 在lr选择java Vuser协议 脚本结构: 一般在init中编写初始化脚本,在action中编写业务流程, ...
- 寻找jar包的好方法
好东西分享下: 下载jar包不用愁 http://maven.outofmemory.cn/
- 关于WebStorm,PhpStorm新版本输入中文问题
此文意在记录webstorm,PhpStorm输入中文无提示的问题,对于百忙中的开发无需浏览下面那一段套路话,直接浏览原文链接或者本博客绿色文字解决问题即可. 对于使用过dw,sublime,brac ...
- localstorage本地存储的应用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- nmon 工具的使用
原文链接:https://www.ibm.com/developerworks/cn/aix/library/analyze_aix/ 引言 nmon 工具可以为 AIX 和 Linux 性能专家提供 ...
- WPF样式学习三
SnapsToDevicePixels 获取或设置在呈现过程,该值来确定呈现此元素是否应使用特定于设备的像素设置. 这是一个依赖项属性. true ,如果元素应以符合呈现到设备像素;否则, false ...
- 创见VR-上海,会后总结
第一次,参加这种VR会,感觉不错.上午突然发现自己之前的一款AR Demo下载量在10-50了,真没想到,虽然这款Demo有一处bug至今未修复 ^^.不过,看来现在AR/VR确实恨火. ZSpace ...