21.react 组件通信
状态属性可以修改
this.setState()中可以写对象,也可以写方法
<script type="text/babel">
class Test extends React.Component{
constructor(...args){
super(...args);
this.state = {
n:1
}
}
fn(){
/*this.setState({
n:this.state.n+1
});*/
/*this.setState(function(prevState,props){
console.log(prevState,props);
return {
n:prevState.n + 1
}
});*/
this.setState((prevState,props)=>({n:prevState.n + 1}));
}
render(){
return <div>
<span>{this.state.n}</span>
<input onClick={this.fn.bind(this)} type="button" value="按钮" />
</div>
}
}
ReactDOM.render(
<Test name="abc"/>,
document.getElementById("app")
);
</script>
res:
事件:
获取点击坐标
<script type="text/babel">
class Test extends React.Component{
constructor(...args){
super(...args);
}
fn(ev){
console.log(1,ev);
console.log(2,ev.clientX,ev.clientY);
}
render(){
return <div>
<input onClick={this.fn.bind(this)} type="button" value="按钮" />
</div>
}
}
ReactDOM.render(
<Test/>,
document.getElementById("app")
);
</script>
res:
事件冒泡:
没有ev.cancelBubble
用ev.stopPropagation();
<script type="text/babel">
class Test extends React.Component{
constructor(...args){
super(...args);
}
div(ev){
alert("div");
}
btn(ev){
//ev.cancelBubble = true;//X 没有这个属性
//console.log( ev.cancelBubble );
ev.stopPropagation();//√
alert("btn");
}
render(){
return <div onClick={this.div.bind(this)}>
<input onClick={this.btn.bind(this)} type="button" value="按钮" />
</div>
}
}
ReactDOM.render(
<Test/>,
document.getElementById("app")
);
</script>
默认事件:
return false;//无效
用ev.preventDefault();
<script type="text/babel">
class Test extends React.Component{
constructor(...args){
super(...args);
}
fn(ev){
ev.preventDefault();
//return false;
}
render(){
return <div>
<a onClick={this.fn.bind(this)} href="http://www.baidu.com/">百度</a>
</div>
}
}
ReactDOM.render(
<Test/>,
document.getElementById("app")
);
</script>
留言板:
留言板添加删除
<script type="text/babel">
class Test extends React.Component{
constructor(...args){
super(...args);
this.state={
msg:"",
arr:["aaa","bbb","ccc"],
}
}
show(ev){
this.setState({
msg:ev.target.value,
})
}
add(){
this.state.arr.unshift(this.state.msg);
this.setState({
arr:this.state.arr
})
}
del(index){
this.state.arr.splice(index,1);
this.setState({
arr:this.state.arr
})
}
render(){
let arr = this.state.arr;
/*let aULi = [];
for(let i = 0; i < arr.length; i++){
aULi.push(<li key={i}>{arr[i]}</li>);
}*/
let aUli = arr.map((item,index)=><li key={index}>{item}<a onClick={this.del.bind(this,index)} href="javascript:;">删除</a></li>);
return <div>
<input type="text" onInput={this.show.bind(this)}/>
<input type="button" onClick ={this.add.bind(this)} value="添加"/>
<ul>
{aUli}
</ul>
</div>
}
}
ReactDOM.render(
<Test/>,
document.getElementById("app"),
)
</script>
res:
数据绑定:
input数据绑定,加value属性时需要加onChange事件
this.setState({
msg:ev.target.value
});
<script type="text/babel">
class Test extends React.Component{
constructor(...args){
super(...args);
this.state = {
msg:"",
}
}
fn(ev){
this.setState({
msg:ev.target.value
});
}
render(){
return <div>
<input type="text" onInput={this.fn.bind(this)} /> <br />
<input type="text" value={this.state.msg} onChange={this.fn.bind(this)} /> <br />
{this.state.msg}
</div>
}
}
ReactDOM.render(
<Test/>,
document.getElementById("app")
);
</script>
res:
求和:
exp1:
<script type="text/babel">
class Test extends React.Component{
constructor(...args){
super(...args);
this.state = {
a:1,b:1
}
}
keyupHandle1(ev){
this.setState({
a:parseInt(ev.target.value),
});
}
keyupHandle2(ev){
this.setState({
b:parseInt(ev.target.value),
});
}
sumHandle(){
}
render(){
return <div>
<input type="text" onKeyUp={this.keyupHandle1.bind(this)} />
<input type="text" onKeyUp={this.keyupHandle2.bind(this)} />
<input onClick={this.sumHandle.bind(this)} type="button" value="=" />
{this.state.a + this.state.b}
</div>
}
}
ReactDOM.render(
<Test/>,
document.getElementById("app")
);
</script>
res:
exp2:
<script type="text/babel">
class Test extends React.Component{
constructor(...args){
super(...args);
this.state = {
a:1,b:1
}
}
sumHandle(){
let oText1 = document.getElementById("txt1");
let oText2 = document.getElementById("txt2");
this.setState({
a:parseInt(oText1.value),
b:parseInt(oText2.value)
});
}
render(){
return <div>
<input id="txt1" type="text" />
<input id="txt2" type="text" />
<input onClick={this.sumHandle.bind(this)} type="button" value="=" />
{this.state.a + this.state.b}
</div>
}
}
ReactDOM.render(
<Test/>,
document.getElementById("app")
);
</script>
res:
exp3:
<script type="text/babel">
class Test extends React.Component{
constructor(...args){
super(...args);
this.state = {
a:1,b:1
}
}
sumHandle(){
console.log(this.refs);
this.setState({
a:parseInt(this.refs.txt1.value),
b:parseInt(this.refs.txt2.value)
});
}
render(){
return <div>
<input ref="txt1" type="text" />
<input ref="txt2" type="text" />
<input onClick={this.sumHandle.bind(this)} type="button" value="=" />
{this.state.a + this.state.b}
</div>
}
}
ReactDOM.render(
<div>
<Test/>
<Test/>
</div>,
document.getElementById("app")
);
</script>
exp3:
<script type="text/babel">
class Test extends React.Component{
constructor(...args){
super(...args);
this.state = {
a:1,b:1
}
}
keyupHandle1(ev){
this.setState({
a:parseInt(ev.target.value),
});
}
keyupHandle2(ev){
this.setState({
b:parseInt(ev.target.value),
});
}
render(){
return <div>
<input type="text" value={this.state.a} onChange={this.keyupHandle1.bind(this)} />
<input type="text" value={this.state.b} onChange={this.keyupHandle2.bind(this)} />
<input type="button" value="=" />
{this.state.a + this.state.b}
</div>
}
}
ReactDOM.render(
<Test/>,
document.getElementById("app")
);
</script>
res:
组件通信:
父子:
父--->子
传递数据:props refs
子--->父
1、需要先把父级传递给子级
2、this.props.parent.xxx
非父子 :需要借助全局变量 缺点:乱!不易管理!
exp1:父--->子
<script type="text/babel">
class Parent extends React.Component{
constructor(...args){
super(...args);
this.state = {
name:"你好呀!"
}
}
render(){
return <div> 父组件 ----{this.state.name}
<Child name={this.state.name}/>
</div>
}
}
class Child extends React.Component{
constructor(...args){
super(...args);
}
render(){
return <div>子组件----{this.props.name}</div>
}
}
ReactDOM.render(
<Parent/>,
document.getElementById("app")
);
</script>
res:
exp2: 子--->父
parent={this}把整个父元素传过去
<script type="text/babel">
class Parent extends React.Component{
constructor(...args){
super(...args);
this.state = {
name:"你好呀!"
}
}
fn(data){
alert("父级");
this.setState({
name:data
})
}
render(){
return <div> 父组件 ----{this.state.name}
<Child name={this.state.name} parent={this} />
</div>
}
}
class Child extends React.Component{
constructor(...args){
super(...args);
}
fn(){
this.props.parent.fn(666);
}
render(){
return <div onClick={this.fn.bind(this)}>子组件----{this.props.name}</div>
}
}
ReactDOM.render(
<Parent/>,
document.getElementById("app")
);
</script>
res:
exp3:父子通信显示删除
<script type="text/babel">
let arr = [
{id:Math.random(),username:"aaa",password:"123"},
{id:Math.random(),username:"bbb",password:"123"},
{id:Math.random(),username:"ccc",password:"123"}
];
//父,列表
class UserList extends React.Component{
constructor(...args){
super(...args);
this.state = {
users:this.props.users
}
}
delHandle(id){
//alert("删除"+id);
this.setState({
users:this.state.users.filter(item => id != item.id)
});
}
render(){
let aUser = this.state.users.map((item,index)=><User key={item.id} parent={this} user={item}/>);
return <ul>
{aUser}
</ul>
}
}
//子,元素
class User extends React.Component{
constructor(...args){
super(...args);
}
fn(id){
this.props.parent.delHandle(id);
}
render(){
return <li>{this.props.user.username}-----{this.props.user.password}
<a onClick={this.fn.bind(this,this.props.user.id)} href="javascript:;">删除</a>
</li>
}
}
ReactDOM.render(
<UserList users={arr}/>,
document.getElementById("app")
);
</script>
res:
exp4:兄弟通信
点击组件2修改组件1,设置全局变量,
<script type="text/babel">
//全局变量
let a = null;
class Comp1 extends React.Component{
constructor(...args){
super(...args);
this.state = {
msg:"aaaa"
}
a=(data)=>{
//alert(1);
this.setState({
msg:data
});
}
}
render(){
return <div>组件1-----{this.state.msg}</div>
}
}
class Comp2 extends React.Component{
constructor(...args){
super(...args);
}
fn(){
a("bbb");
}
render(){
return <div onClick={this.fn.bind(this)}>组件2</div>
}
}
ReactDOM.render(
<div>
<Comp1/>
<Comp2/>
</div>,
document.getElementById("app")
);
</script>
res:
21.react 组件通信的更多相关文章
- react第六单元(react组件通信-父子组件通信-子父组件通信-跨级组件的传参方式-context方式的传参)
第六单元(react组件通信-父子组件通信-子父组件通信-跨级组件的传参方式-context方式的传参) #课程目标 1.梳理react组件之间的关系 2.掌握父子传值的方法 3.掌握子父传值的方法 ...
- react组件通信那些事儿
父组件是调用组件的组件.现在看来,感觉父组件就是一个壳子,定义好壳子里面会有什么,而子组件是一个具体的实现,说明,会用到什么东西,如果有这些东西,会进行什么操作.总之,父组件是材料,有水和泥,子组件告 ...
- React/组件通信
组件通信可以分为以下几种: 父组件向子组件通信 子组件向父组件通信 跨级组件的通信及context 没有嵌套关系的组件通信 父组件向子组件通信 父组件通过props向子组件传递需要的信息. 子 ...
- React组件通信技巧
效果图 communication.gif 点击查看Github完整源码 1.父向子通信 直接标签中插入参数即可 //number只是个例子 let _number = this.state.numb ...
- React组件通信
1.父子通信 父 -> 子 props子 -> 父 回调函数,父组件通过props向子组件传递一个函数,子组件调用函数,父组件在回调函数中用setState改变自身状态 2.跨层级通信 1 ...
- 使用reflux进行react组件之间的通信
前言 组件之间为什么要通信?因为有依赖. 那么,作为React组件,怎么通信? React官网说, 进行 父-子 通信,可以直接pass props. 进行 子-父 通信,往父组件传给子组件的函数注入 ...
- React之组件通信
组件通信无外乎,下面这三种父子组件,子父组件,平行组件(也叫兄弟组件)间的数据传输.下面我们来分别说一下: 父子组件: var Demo=React.createClass({ getInitialS ...
- 【JAVASCRIPT】React学习- 数据流(组件通信)
摘要 react 学习包括几个部分: 文本渲染 JSX 语法 组件化思想 数据流 一 组件通信如何实现 父子组件之间不存在继承关系 1.1 父=>子通信 父组件可以通过 this.refs.xx ...
- 关于react组件之间的通信
才开始学react刚好到组件通信这一块,就简单的记录下组件间的通信方式:父到子:props.context,子到父:自定义事件.回调,兄弟组件:共父props传递.自定义事件import React, ...
随机推荐
- 演练:调试 Windows 窗体
Windows 窗体是最常见的托管应用程序之一. Windows 窗体创建标准的 Windows 应用程序. 你可以完成此演练使用 Visual Basic 中, C#,或 c + +. 首先,您必须 ...
- Ubuntu 18 LTS netplan 网络配置
一.配置网络 1.通过netplan配置网络 #配置网络 nulige@ubuntu:/etc/netplan$ sudo apt install ifupdown nulige@ubuntu:/et ...
- MySQL表与表之间的SQL Joins图介绍
下图很好的解释了各表之间SQL Joins之间的关系
- SSE图像算法优化系列二十三: 基于value-and-criterion structure 系列滤波器(如Kuwahara,MLV,MCV滤波器)的优化。
基于value-and-criterion structure方式的实现的滤波器在原理上其实比较简单,感觉下面论文中得一段话已经描述的比较清晰了,直接贴英文吧,感觉翻译过来反而失去了原始的韵味了. T ...
- PhpStorm配置SVN的完整方法
1.安装SVN时注意选择“command line client tools"默认是不安装的 2.设置系统环境变量 3.在PhpStorm上设置如下 4.然后通过VCS就可以上传导入你的工程 ...
- CouchDB 简单HTTP接口使用说明
目录 1.简介 2.安装 2.HTTP接口简单使用 2.1.认证接口 2.1.1 Basic Authentication 2.1.2 Cookie Authentication 2.2 创建与删除数 ...
- 安装Docker,Asp.net core
升级项目到.NET Core 2.0,在Linux上安装Docker,并成功部署 Docker从入门到实践 一.安装Docker a).设置Docker仓库 1.按惯例,首先更新Ubuntu的包索引 ...
- paste
echo "step 1" >> steplog.txt echo "step 1" sudo apt-get install ...
- 【iCore4 双核心板_ARM】例程三十五:HTTP_IAP_ARM实验——更新升级STM32
实验现象: 核心代码: int main(void) { led.initialize(); //LED³õʼ»¯ key.initialize(); if(ARM_KEY_STATE == KEY ...
- Vue 创建组件的方式
Vue 创建组件的方式 2018年08月07日 11:10:56 虔诚带着决然 阅读数:1015 版权声明:本文为博主原创文章,未经博主允许不得用做其他商业活动. https://blog.csd ...