React(5)

1.受控组件案例

1.1之前的影院案例改写

import React, { Component } from 'react'
import axios from 'axios'
import BetterScroll from 'better-scroll'
import './css/02_tab.css'export default class Cinema extends Component {constructor() {super();this.state = {cinemaList: [],mytext:''// backcinemaList: []}//react中使用axios第三方的库  专门用来请求数据// axios.get("请求地址").then(res=>{}).catch(err=>{console.log(err);})axios({url: "https://m.maizuo.com/gateway?cityId=110100&ticketFlag=1&k=7406159",method: 'get',headers: {'X-Client-Info': '{"a":"3000","ch":"1002","v":"5.0.4","e":"16395416565231270166529","bc":"110100"}','X-Host': 'mall.film-ticket.cinema.list'}}).then(res => {console.log(res.data)this.setState({cinemaList: res.data.data.cinemas,// backcinemaList: res.data.data.cinemas})new BetterScroll(".wrapper")}).catch(err => console.log(err))}render() {return (<div><div>{/* <input onInput={this.handleInput}></input>实时搜索 */}<input value={this.state.mytext} onChange={(evt)=>{this.setState({mytext:evt.target.value},()=>{console.log(this.state.mytext);})}}></input>实时搜索</div><div className='wrapper' style={{height:'800px',overflow:'hidden'}}><div className='content'>{this.getCinemaList().map((item) =><dl key={item.cinemaId}><dt>{item.name}</dt><dd>{item.address}</dd></dl>)}</div></div></div>)}getCinemaList=()=>{//return this.state.cinemaListreturn this.state.cinemaList.filter(item => item.name.toUpperCase().includes(this.state.mytext.toUpperCase()) ||item.address.toUpperCase().includes(this.state.mytext.toUpperCase()))}// handleInput = (event) => {//     console.log("input", event.target.value);//     // 数组的filter方法不会影响原数组//     var newList = this.state.backcinemaList.filter(item => item.name.toUpperCase().includes(event.target.value.toUpperCase()) ||//         item.address.toUpperCase().includes(event.target.value.toUpperCase()))//     this.setState({//         cinemaList: newList//     })// }
}

1.2 todolist改写


import React, { Component } from 'react'export default class App extends Component {constructor() {super();this.state = {addList: [{id: Math.random()*10000, title: "张三"}],mytext:''}}//myref = React.createRef();render() {return (<div><input value={this.state.mytext} onChange={(evt)=>{this.setState({mytext:evt.target.value})}}></input><button onClick={() => {this.handler()}}>增加</button><ul>{this.state.addList.map((item,index) =><li key={item.id}>{/* {item.id}----{item.title} */}<span dangerouslySetInnerHTML={{__html:item.id+"------"+item.title}}></span><button onClick={()=>{this.deleteList(index)}}>删除</button></li>)}</ul>{/* {this.state.addList.length===0 ?<div>暂无待办事项</div>:null} */}{this.state.addList.length===0 && <div>暂无待办事项</div>}</div>)}handler = () => {let newList = [...this.state.addList]newList.push({id: Math.random()*10000,title: this.state.mytext})this.setState({addList: newList,mytext:''}) }deleteList=(index)=>{console.log(index);let newList = [...this.state.addList];newList.splice(index,1);//从该下标开始删除  删除一个this.setState({addList: newList})}
}

2.父子通信

场景:比如我有一个父组件   父组件内部有1个导航组件  一个侧边栏组件   在导航栏组件中,我做了一个操作后,想让侧边栏组件隐藏与显示    

这就需要子传父了   导航栏组件传递信号给父组件  父组件再去控制侧边栏组件

例如:

父组件

通过state中的isShow来控制侧边栏组件的显示

import React, { Component } from 'react'
import Navbar from './compoent/Navbar'
import SideBar from './compoent/SideBar'export default class App extends Component {state={isShow:true,}render() {return (<div>           <Navbar/>{this.state.isShow && <SideBar/>}</div>)}
}

侧边栏组件

import React, { Component } from 'react'export default class SideBar extends Component {render() {return (<div style={{background:"green",width:"300px"}}><ul><li>11111</li><li>11111</li><li>11111</li><li>11111</li><li>11111</li><li>11111</li><li>11111</li></ul></div>)}
}

导航栏组件

import React, { Component } from 'react'export default class Navbar extends Component {render() {return (<div style={{background:"yellow",width:"400px"}}><button>控制侧边栏</button></div>)}
}

 现在需要去做修改,使用event属性传一个回调函数,然后子组件中调用此函数

可以发现子组件中点击按钮后,已经可以控制父组件中打印了。因此咱后面可以在父组件中修改state中的值了

export default class App extends Component {state={isShow:true,}render() {return (<div>           <Navbar event={()=>{console.log("父组件中可以修改state了");this.setState({isShow:!this.state.isShow})}}/>{this.state.isShow && <SideBar/>}</div>)}
}

总结:

父传子:传属性

子传父:父给子一个函数,子执行此函数  当成回调函数

3.父子通信版:表单域组件


import React, { Component } from 'react'
import Field from './compoent/Field'export default class App extends Component {state={username:"",password:""}render() {return (<div><Field label="用户名" type="text" value={this.state.username} onChangeEvent={(value)=>{// console.log("value==="+value);this.setState({username:value})}}></Field><Field label="密码" type="password" value={this.state.password} onChangeEvent={(value)=>{// console.log("value==="+value);this.setState({password:value})}}></Field><button onClick={()=>{console.log(this.state.username+"\t"+this.state.password+"发送给后端校验");}}>登录</button><button onClick={()=>{this.setState({username:"",password:""})}}>重置</button></div>)}
}


import React, { Component } from 'react'export default class Field extends Component {render() {return (<div><label>{this.props.label}</label><input type={this.props.type} value={this.props.value} onChange={(evt)=>{// console.log(evt.target.value);this.props.onChangeEvent(evt.target.value);}}></input></div>)}
}

4.ref版:表单域组件


import React, { Component } from 'react'
import Field2 from './compoent/Field2'export default class App extends Component {username=React.createRef();password=React.createRef();render() {return (<div><Field2 label="用户名" type="text" ref={this.username}></Field2><Field2 label="密码" type="password" ref={this.password}></Field2><button onClick={()=>{console.log(this.username);  //可以发现这里拿到的是Field2这个组件console.log(this.username.current.state.value+"\t"+this.password.current.state.value+"发送给后端校验");}}>登录</button><button onClick={()=>{this.username.current.clear();this.password.current.clear();}}>重置</button></div>)}
}


import React, { Component } from 'react'export default class Field2 extends Component {state={value:""}clear(){this.setState({value:""})}render() {return (<div><label>{this.props.label}</label><input type={this.props.type}  value={this.state.value} onChange={(evt)=>{this.setState({value:evt.target.value})}}></input></div>)}
}

   console.log(this.username);  //可以发现这里拿到的是Field2这个组件

5.非父子通信方式

5.1 状态提升(中间人模式)

React中的状态提升概括来说,就是将多个组件需要共享的状态提升到它们最近的父组件上。在父组件上改变这个状态然后通过props分发给子组件。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/67722.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过 Amazon SageMaker JumpStart 部署 Llama 2 快速构建专属 LLM 应用

来自 Meta 的 Llama 2 基础模型现已在 Amazon SageMaker JumpStart 中提供。我们可以通过使用 Amazon SageMaker JumpStart 快速部署 Llama 2 模型&#xff0c;并且结合开源 UI 工具 Gradio 打造专属 LLM 应用。 Llama 2 简介 Llama 2 是使用优化的 Transformer 架构的自回归语…

怎么把CAD转成JPG图片?一个方法教你如何转换

CAD是计算机辅助设计的缩写&#xff0c;通常指的是AutoCAD软件所生成的DWG文件格式。DWG是一种二进制文件格式&#xff0c;用于保存2D和3D设计数据和元数据&#xff0c;支持多种操作系统和程序使用。该格式通常用于工程、建筑、制造和其他领域的设计和绘图。 CAD文件转换成JPG图…

【Rust】Rust学习 第十一章编写自动化测试

Rust 是一个相当注重正确性的编程语言&#xff0c;不过正确性是一个难以证明的复杂主题。Rust 的类型系统在此问题上下了很大的功夫&#xff0c;不过它不可能捕获所有种类的错误。为此&#xff0c;Rust 也在语言本身包含了编写软件测试的支持。 编写一个叫做 add_two 的将传递…

Debian 10驱动Broadcom 无线网卡

用lspci命令查询无线网卡品牌&#xff1a; 运行下面代码后&#xff0c;重启即可。 apt-get install linux-image-$(uname -r|sed s,[^-]*-[^-]*-,,) linux-headers-$(uname -r|sed s,[^-]*-[^-]*-,,) broadcom-sta-dkms

/proc/net/dev 最后一行读2次

网络2倍字节量和网速&#xff0c;百思不得其解。 void netdev(SamplePlugin *sample) {FILE *fp;char s[150], itf[10];long long r1, r2, r3, r4, r5, r6, r7, r8, t1, t2, t3, t4, t5, t6, t7, t8;int i0;sample->rb 0;sample->tb 0;fp fopen("/proc/net/dev&…

一般股票量化交易接口需要用到哪些编程语言?

股票量化交易接口可以使用多种编程语言进行开发和调用。以下是一些常用的编程语言&#xff1a; 1. Python&#xff1a;Python是一种脚本语言&#xff0c;广泛应用于量化交易领域。它有丰富的第三方库和工具&#xff0c;如Pandas、NumPy和pyalgotrade等&#xff0c;可用于数据分…

Makefile多个子文件夹

首先&#xff0c;目录结构&#xff1a; 其中根目录Makefile主要作用是调用其他子文件夹Makefile&#xff0c;每个子模块执行各自编译后在build文件夹下生成obj文件&#xff0c;最后再执行build文件夹下Makefile进行链接。 根目录Makefile&#xff1a; TARGET ACT_Drv ##SRC_D…

【STM32】利用CubeMX对FreeRTOS用按键控制任务

对于FreeRTOS中的操作&#xff0c;最常用的就是创建、删除、暂停和恢复任务。 此次实验目标&#xff1a; 1.创建任务一&#xff1a;LED1每间隔1秒闪烁一次&#xff0c;并通过串口打印 2.创建任务二&#xff1a;LED2每间隔0.5秒闪烁一次&#xff0c;并通过串口打印 3.创建任…

直接在html中引入Vue.js的cdn来实现一个简单的上传图片组件

摘要 当使用 Vue.js 的 CDN 来实现一个简单的上传图片组件时&#xff0c;你可以利用 Vue 的数据绑定和事件处理能力&#xff0c;结合 HTML 和 CSS&#xff0c;轻松地创建一个交互式的图片上传界面。以下是一个示例&#xff1a; 代码结构 index.html <!DOCTYPE html> &…

应用层协议——TCP(上)

文章目录 1. TCP协议1.1 TCP协议段格式1.2 确认应答(ACK)机制1.3 16位窗口大小1.4 6位标志位1.4.1 TCP三次握手 1.5 确认应答(ACK)机制1.6 超时重传机制1.7 连接管理机制1.7.1 理解TIME_WAIT状态1.7.2 理解 CLOSE_WAIT 状态 1. TCP协议 TCP全称为传输控制协议&#xff0c;意思…

Win10安装GPU支持的最新版本的tensorflow

我在安装好cuda和cudnn后&#xff0c;使用pip install tensorflow安装的tensorflow都提示不能找到GPU&#xff0c; 为此怀疑默认暗转的tensorflow是不带GPU支持的。 在tensorflow官网提供了多个版本的GPU支持的windows的安装包 https://www.tensorflow.org/install/pip?hlz…

00 - 环境配置

查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;GIT常用场景- 目录 文章目录 1. 环境说明2. 安装配置2.1 配置user信息2.2 config的三个作用域 3. 建git仓库3.1 把已有的项目代码纳入git管理3.2 新建的项目直接用git管理3.3 配置local的user和email3.4 优先级&…