状态属性可以修改

this.setState()中可以写对象,也可以写方法

  1. <script type="text/babel">
  2. class Test extends React.Component{
  3. constructor(...args){
  4. super(...args);
  5. this.state = {
  6. n:1
  7. }
  8. }
  9. fn(){
  10. /*this.setState({
  11. n:this.state.n+1
  12. });*/
  13. /*this.setState(function(prevState,props){
  14. console.log(prevState,props);
  15. return {
  16. n:prevState.n + 1
  17. }
  18. });*/
  19. this.setState((prevState,props)=>({n:prevState.n + 1}));
  20. }
  21. render(){
  22. return <div>
  23. <span>{this.state.n}</span>
  24. <input onClick={this.fn.bind(this)} type="button" value="按钮" />
  25. </div>
  26. }
  27. }
  28. ReactDOM.render(
  29. <Test name="abc"/>,
  30. document.getElementById("app")
  31. );
  32. </script>

res:

事件:

获取点击坐标

  1. <script type="text/babel">
  2. class Test extends React.Component{
  3. constructor(...args){
  4. super(...args);
  5. }
  6. fn(ev){
  7. console.log(1,ev);
  8. console.log(2,ev.clientX,ev.clientY);
  9. }
  10. render(){
  11. return <div>
  12. <input onClick={this.fn.bind(this)} type="button" value="按钮" />
  13. </div>
  14. }
  15. }
  16. ReactDOM.render(
  17. <Test/>,
  18. document.getElementById("app")
  19. );
  20. </script>

res:

事件冒泡:

没有ev.cancelBubble

用ev.stopPropagation();

  1. <script type="text/babel">
  2. class Test extends React.Component{
  3. constructor(...args){
  4. super(...args);
  5. }
  6. div(ev){
  7. alert("div");
  8. }
  9. btn(ev){
  10. //ev.cancelBubble = true;//X 没有这个属性
  11. //console.log( ev.cancelBubble );
  12. ev.stopPropagation();//√
  13. alert("btn");
  14. }
  15. render(){
  16. return <div onClick={this.div.bind(this)}>
  17. <input onClick={this.btn.bind(this)} type="button" value="按钮" />
  18. </div>
  19. }
  20. }
  21. ReactDOM.render(
  22. <Test/>,
  23. document.getElementById("app")
  24. );
  25. </script>

默认事件:

return false;//无效

用ev.preventDefault();

  1. <script type="text/babel">
  2. class Test extends React.Component{
  3. constructor(...args){
  4. super(...args);
  5. }
  6. fn(ev){
  7. ev.preventDefault();
  8. //return false;
  9. }
  10. render(){
  11. return <div>
  12. <a onClick={this.fn.bind(this)} href="http://www.baidu.com/">百度</a>
  13. </div>
  14. }
  15. }
  16. ReactDOM.render(
  17. <Test/>,
  18. document.getElementById("app")
  19. );
  20. </script>

留言板:

留言板添加删除

  1. <script type="text/babel">
  2. class Test extends React.Component{
  3. constructor(...args){
  4. super(...args);
  5. this.state={
  6. msg:"",
  7. arr:["aaa","bbb","ccc"],
  8. }
  9. }
  10. show(ev){
  11. this.setState({
  12. msg:ev.target.value,
  13. })
  14. }
  15. add(){
  16. this.state.arr.unshift(this.state.msg);
  17. this.setState({
  18. arr:this.state.arr
  19. })
  20. }
  21. del(index){
  22. this.state.arr.splice(index,1);
  23. this.setState({
  24. arr:this.state.arr
  25. })
  26. }
  27. render(){
  28. let arr = this.state.arr;
  29. /*let aULi = [];
  30. for(let i = 0; i < arr.length; i++){
  31. aULi.push(<li key={i}>{arr[i]}</li>);
  32. }*/
  33. let aUli = arr.map((item,index)=><li key={index}>{item}<a onClick={this.del.bind(this,index)} href="javascript:;">删除</a></li>);
  34. return <div>
  35. <input type="text" onInput={this.show.bind(this)}/>
  36. <input type="button" onClick ={this.add.bind(this)} value="添加"/>
  37. <ul>
  38. {aUli}
  39. </ul>
  40. </div>
  41. }
  42. }
  43. ReactDOM.render(
  44. <Test/>,
  45. document.getElementById("app"),
  46. )
  47. </script>

res:



数据绑定:

input数据绑定,加value属性时需要加onChange事件

this.setState({

msg:ev.target.value

});

  1. <script type="text/babel">
  2. class Test extends React.Component{
  3. constructor(...args){
  4. super(...args);
  5. this.state = {
  6. msg:"",
  7. }
  8. }
  9. fn(ev){
  10. this.setState({
  11. msg:ev.target.value
  12. });
  13. }
  14. render(){
  15. return <div>
  16. <input type="text" onInput={this.fn.bind(this)} /> <br />
  17. <input type="text" value={this.state.msg} onChange={this.fn.bind(this)} /> <br />
  18. {this.state.msg}
  19. </div>
  20. }
  21. }
  22. ReactDOM.render(
  23. <Test/>,
  24. document.getElementById("app")
  25. );
  26. </script>

res:

求和:

exp1:

  1. <script type="text/babel">
  2. class Test extends React.Component{
  3. constructor(...args){
  4. super(...args);
  5. this.state = {
  6. a:1,b:1
  7. }
  8. }
  9. keyupHandle1(ev){
  10. this.setState({
  11. a:parseInt(ev.target.value),
  12. });
  13. }
  14. keyupHandle2(ev){
  15. this.setState({
  16. b:parseInt(ev.target.value),
  17. });
  18. }
  19. sumHandle(){
  20. }
  21. render(){
  22. return <div>
  23. <input type="text" onKeyUp={this.keyupHandle1.bind(this)} />
  24. <input type="text" onKeyUp={this.keyupHandle2.bind(this)} />
  25. <input onClick={this.sumHandle.bind(this)} type="button" value="=" />
  26. {this.state.a + this.state.b}
  27. </div>
  28. }
  29. }
  30. ReactDOM.render(
  31. <Test/>,
  32. document.getElementById("app")
  33. );
  34. </script>

res:

exp2:

  1. <script type="text/babel">
  2. class Test extends React.Component{
  3. constructor(...args){
  4. super(...args);
  5. this.state = {
  6. a:1,b:1
  7. }
  8. }
  9. sumHandle(){
  10. let oText1 = document.getElementById("txt1");
  11. let oText2 = document.getElementById("txt2");
  12. this.setState({
  13. a:parseInt(oText1.value),
  14. b:parseInt(oText2.value)
  15. });
  16. }
  17. render(){
  18. return <div>
  19. <input id="txt1" type="text" />
  20. <input id="txt2" type="text" />
  21. <input onClick={this.sumHandle.bind(this)} type="button" value="=" />
  22. {this.state.a + this.state.b}
  23. </div>
  24. }
  25. }
  26. ReactDOM.render(
  27. <Test/>,
  28. document.getElementById("app")
  29. );
  30. </script>

res:

exp3:

  1. <script type="text/babel">
  2. class Test extends React.Component{
  3. constructor(...args){
  4. super(...args);
  5. this.state = {
  6. a:1,b:1
  7. }
  8. }
  9. sumHandle(){
  10. console.log(this.refs);
  11. this.setState({
  12. a:parseInt(this.refs.txt1.value),
  13. b:parseInt(this.refs.txt2.value)
  14. });
  15. }
  16. render(){
  17. return <div>
  18. <input ref="txt1" type="text" />
  19. <input ref="txt2" type="text" />
  20. <input onClick={this.sumHandle.bind(this)} type="button" value="=" />
  21. {this.state.a + this.state.b}
  22. </div>
  23. }
  24. }
  25. ReactDOM.render(
  26. <div>
  27. <Test/>
  28. <Test/>
  29. </div>,
  30. document.getElementById("app")
  31. );
  32. </script>

exp3:

  1. <script type="text/babel">
  2. class Test extends React.Component{
  3. constructor(...args){
  4. super(...args);
  5. this.state = {
  6. a:1,b:1
  7. }
  8. }
  9. keyupHandle1(ev){
  10. this.setState({
  11. a:parseInt(ev.target.value),
  12. });
  13. }
  14. keyupHandle2(ev){
  15. this.setState({
  16. b:parseInt(ev.target.value),
  17. });
  18. }
  19. render(){
  20. return <div>
  21. <input type="text" value={this.state.a} onChange={this.keyupHandle1.bind(this)} />
  22. <input type="text" value={this.state.b} onChange={this.keyupHandle2.bind(this)} />
  23. <input type="button" value="=" />
  24. {this.state.a + this.state.b}
  25. </div>
  26. }
  27. }
  28. ReactDOM.render(
  29. <Test/>,
  30. document.getElementById("app")
  31. );
  32. </script>

res:

组件通信:

父子:

父--->子

传递数据:props refs

子--->父

1、需要先把父级传递给子级

2、this.props.parent.xxx

非父子 :需要借助全局变量 缺点:乱!不易管理!

exp1:父--->子
  1. <script type="text/babel">
  2. class Parent extends React.Component{
  3. constructor(...args){
  4. super(...args);
  5. this.state = {
  6. name:"你好呀!"
  7. }
  8. }
  9. render(){
  10. return <div> 父组件 ----{this.state.name}
  11. <Child name={this.state.name}/>
  12. </div>
  13. }
  14. }
  15. class Child extends React.Component{
  16. constructor(...args){
  17. super(...args);
  18. }
  19. render(){
  20. return <div>子组件----{this.props.name}</div>
  21. }
  22. }
  23. ReactDOM.render(
  24. <Parent/>,
  25. document.getElementById("app")
  26. );
  27. </script>

res:

exp2: 子--->父

parent={this}把整个父元素传过去

  1. <script type="text/babel">
  2. class Parent extends React.Component{
  3. constructor(...args){
  4. super(...args);
  5. this.state = {
  6. name:"你好呀!"
  7. }
  8. }
  9. fn(data){
  10. alert("父级");
  11. this.setState({
  12. name:data
  13. })
  14. }
  15. render(){
  16. return <div> 父组件 ----{this.state.name}
  17. <Child name={this.state.name} parent={this} />
  18. </div>
  19. }
  20. }
  21. class Child extends React.Component{
  22. constructor(...args){
  23. super(...args);
  24. }
  25. fn(){
  26. this.props.parent.fn(666);
  27. }
  28. render(){
  29. return <div onClick={this.fn.bind(this)}>子组件----{this.props.name}</div>
  30. }
  31. }
  32. ReactDOM.render(
  33. <Parent/>,
  34. document.getElementById("app")
  35. );
  36. </script>

res:





exp3:父子通信显示删除
  1. <script type="text/babel">
  2. let arr = [
  3. {id:Math.random(),username:"aaa",password:"123"},
  4. {id:Math.random(),username:"bbb",password:"123"},
  5. {id:Math.random(),username:"ccc",password:"123"}
  6. ];
  7. //父,列表
  8. class UserList extends React.Component{
  9. constructor(...args){
  10. super(...args);
  11. this.state = {
  12. users:this.props.users
  13. }
  14. }
  15. delHandle(id){
  16. //alert("删除"+id);
  17. this.setState({
  18. users:this.state.users.filter(item => id != item.id)
  19. });
  20. }
  21. render(){
  22. let aUser = this.state.users.map((item,index)=><User key={item.id} parent={this} user={item}/>);
  23. return <ul>
  24. {aUser}
  25. </ul>
  26. }
  27. }
  28. //子,元素
  29. class User extends React.Component{
  30. constructor(...args){
  31. super(...args);
  32. }
  33. fn(id){
  34. this.props.parent.delHandle(id);
  35. }
  36. render(){
  37. return <li>{this.props.user.username}-----{this.props.user.password}
  38. <a onClick={this.fn.bind(this,this.props.user.id)} href="javascript:;">删除</a>
  39. </li>
  40. }
  41. }
  42. ReactDOM.render(
  43. <UserList users={arr}/>,
  44. document.getElementById("app")
  45. );
  46. </script>

res:

exp4:兄弟通信

点击组件2修改组件1,设置全局变量,

  1. <script type="text/babel">
  2. //全局变量
  3. let a = null;
  4. class Comp1 extends React.Component{
  5. constructor(...args){
  6. super(...args);
  7. this.state = {
  8. msg:"aaaa"
  9. }
  10. a=(data)=>{
  11. //alert(1);
  12. this.setState({
  13. msg:data
  14. });
  15. }
  16. }
  17. render(){
  18. return <div>组件1-----{this.state.msg}</div>
  19. }
  20. }
  21. class Comp2 extends React.Component{
  22. constructor(...args){
  23. super(...args);
  24. }
  25. fn(){
  26. a("bbb");
  27. }
  28. render(){
  29. return <div onClick={this.fn.bind(this)}>组件2</div>
  30. }
  31. }
  32. ReactDOM.render(
  33. <div>
  34. <Comp1/>
  35. <Comp2/>
  36. </div>,
  37. document.getElementById("app")
  38. );
  39. </script>

res:



21.react 组件通信的更多相关文章

  1. react第六单元(react组件通信-父子组件通信-子父组件通信-跨级组件的传参方式-context方式的传参)

    第六单元(react组件通信-父子组件通信-子父组件通信-跨级组件的传参方式-context方式的传参) #课程目标 1.梳理react组件之间的关系 2.掌握父子传值的方法 3.掌握子父传值的方法 ...

  2. react组件通信那些事儿

    父组件是调用组件的组件.现在看来,感觉父组件就是一个壳子,定义好壳子里面会有什么,而子组件是一个具体的实现,说明,会用到什么东西,如果有这些东西,会进行什么操作.总之,父组件是材料,有水和泥,子组件告 ...

  3. React/组件通信

    组件通信可以分为以下几种: 父组件向子组件通信 子组件向父组件通信 跨级组件的通信及context 没有嵌套关系的组件通信 父组件向子组件通信   父组件通过props向子组件传递需要的信息.   子 ...

  4. React组件通信技巧

    效果图 communication.gif 点击查看Github完整源码 1.父向子通信 直接标签中插入参数即可 //number只是个例子 let _number = this.state.numb ...

  5. React组件通信

    1.父子通信 父 -> 子 props子 -> 父 回调函数,父组件通过props向子组件传递一个函数,子组件调用函数,父组件在回调函数中用setState改变自身状态 2.跨层级通信 1 ...

  6. 使用reflux进行react组件之间的通信

    前言 组件之间为什么要通信?因为有依赖. 那么,作为React组件,怎么通信? React官网说, 进行 父-子 通信,可以直接pass props. 进行 子-父 通信,往父组件传给子组件的函数注入 ...

  7. React之组件通信

    组件通信无外乎,下面这三种父子组件,子父组件,平行组件(也叫兄弟组件)间的数据传输.下面我们来分别说一下: 父子组件: var Demo=React.createClass({ getInitialS ...

  8. 【JAVASCRIPT】React学习- 数据流(组件通信)

    摘要 react 学习包括几个部分: 文本渲染 JSX 语法 组件化思想 数据流 一 组件通信如何实现 父子组件之间不存在继承关系 1.1 父=>子通信 父组件可以通过 this.refs.xx ...

  9. 关于react组件之间的通信

    才开始学react刚好到组件通信这一块,就简单的记录下组件间的通信方式:父到子:props.context,子到父:自定义事件.回调,兄弟组件:共父props传递.自定义事件import React, ...

随机推荐

  1. Spring quartz 单机、集群+websocket集群实现文本、图片、声音、文件下载及推送、接收及显示

    相关环境 Nginx,Spring5.x当前(要选择4.0+),tomcat9.x或8.x都可以,Quartz 2.x集群(实际运用是Quartz的集群模式和单机模式共存的) 测试面页:http:// ...

  2. 关于 IIS7.0下文件写入无权限的解决办法

    1. 在IIS Web站点上右键 --> 编辑权限 2. 在弹出的窗体上选择[安全]选项卡,如图: 3. 在安全选项卡中点击[编辑]按钮,弹出如图对话框: 4. 点击[添加]按钮,弹出如图对话框 ...

  3. Spring @Configuration 和 @Component 区别

    Spring @Configuration 和 @Component 区别 一句话概括就是 @Configuration 中所有带 @Bean 注解的方法都会被动态代理,因此调用该方法返回的都是同一个 ...

  4. IDEA攻略合辑

    AS使用lombok注解报错:Annotation processors must be explicitly declared now. The following dependencies on ...

  5. webpack 配置缓存

    1.输出文件的文件名 加hash 2.提取引导模板 3.模块标识符 https://webpack.docschina.org/guides/caching/#src/components/Sideb ...

  6. 【RS】Collaborative Memory Network for Recommendation Systems - 基于协同记忆网络的推荐系统

    [论文标题]Collaborative Memory Network for Recommendation Systems    (SIGIR'18) [论文作者]—Travis Ebesu (San ...

  7. Ubuntu16.04安装串口调试工具gtkterm

    gtkterm是一个用GTK+写的串口终端. 安装:sudo apt install gtkterm 配置文件的位置为:~/.gtktermrc [default] port = /dev/ttyUS ...

  8. WINDOWS API ——GETFILETIME——获取文件时间

    GetSystemTime(LPSYSTEMTIME lpSystemTime)得到系统时间,这个时间是标准的UTC时间,也就是没有包含任何时区的时间的GetLocalTime(LPSYSTEMTIM ...

  9. Python之练习数学运用代码

    1.对数函数 import math import matplotlib.pyplot as plt import numpy as np if __name__ == '__main__': x = ...

  10. Java并发编程:4种线程池和缓冲队列BlockingQueue

    一. 线程池简介 1. 线程池的概念: 线程池就是首先创建一些线程,它们的集合称为线程池.使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动 ...