React(2)

题外话:vscode有个插件可以很方便的快速写代码

输入rcc回车

 

 1.组件嵌套

import React, { Component } from 'react'class Navbar extends Component{render(){return <div>Navbar</div>}
}const Swiper=()=>{return <div>Swiper</div>
}const Tabbar=()=>{return <div>Tabbar</div>
}export default class App extends Component {render() {return (<div><Navbar></Navbar><Swiper></Swiper><Tabbar></Tabbar></div>)}
}

 如果想要继续嵌套  比如在NavBar组件中加入其它组件

错误的做法

 正确的做法

既然你说在Navbar组件里面   那就去这个组件里面加

2.组件的样式

import React, { Component } from 'react'export default class StyleApp extends Component {render() {var name="zhangsan";return (<section><div>1+2</div><div>{1+2}</div><div>{10>20? name:'lisi'}</div></section>)}
}

 引入变量   执行表达式运算   使用{ }括起来

当我们给div加style样式的时候,一般我们是

<div style="background:red">样式</div>

但是放在react这里会报错

 The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX.

“style”道具需要从样式属性到值的映射,而不是字符串。例如,当使用JSX时,style={{marginRight:spaceing+'em'}}。

也就是说我们需要使用{{ }} 或者 定义个对象传入

import React, { Component } from 'react'export default class StyleApp extends Component {render() {var name="zhangsan";var style2={background:"blue"}return (<section><div>1+2</div><div>{1+2}</div><div>{10>20? name:'lisi'}</div><div style={{background:"red"}}>样式1</div><div style={style2}>样式2</div></section>)}
}

也可以引入自己写的css文件   就在js中引入  不要去html引入   不会热加载

.active{background-color: rgb(0, 255, 98);
}

可以将class改为className

总结两种方式:

1.行内样式

// 注意这里的两个括号,第一个表示我们在要JSX里插入JS了,第二个是对象的括号
<p style={{color:'red', fontSize:'14px'}}>Hello world</p>

2.使用class

React推荐我们使用行内样式,因为React觉得每一个组件都是一个独立的整体

其实我们大多数情况下还是大量的在为元素添加类名,但是需要注意的是, class 需要写成 className (因为毕竟是在写类js代码,会收到js规则的现在,而 class 是关键字)

3.事件绑定处理

3.1 绑定事件

采用on+事件名的方式来绑定一个事件,注意,这里和原生的事件是有区别的,原生的事件全是小写 onclick , React里的事件是驼峰 onClick ,React的事件并不是原生事件,而是合成事件。

onClick  onMouseOver  .......

 <button onClick={()=>{console.log("开始");}}>添加</button>

3.2 事件handler的写法

1.直接在render里写行内的箭头函数(不推荐)

2.在组件内使用箭头函数定义一个方法(推荐)

3.直接在组件内定义一个非箭头函数的方法,然后在render里直接使用 onClick= {this.handleClick.bind(this)} (不推荐)

4.直接在组件内定义一个非箭头函数的方法,然后在constructor里bind(this)(推荐)

bind(this) 修正this指向


import React, { Component } from 'react'export default class BindAPP extends Component {render() {return (<section><div>事件绑定</div><div><input></input><button onClick={()=>{console.log("开始1");}}>添加</button><button onClick={this.handler1}>添加1</button>  //不推荐<button onClick={this.handler1.bind(this)}>添加1</button>  //不推荐<button onClick={this.handler2}>添加2</button><button onClick={()=>{this.handler3()   //比较推荐}}>添加3</button></div></section>)}handler1(){console.log("开始111");}handler2=()=>{console.log("开始222");}handler3=()=>{console.log("开始333");}
}

 注意:前面两种不要自作主张this.handler加括号   this.handler() 错误错误!!!!!

如果this.handler()会自动执行   由于该方法里面没有写返回值  导致执行一次之后就是undefined

导致onclick点击是没反应的

3.3 Event 对象

和普通浏览器一样,事件handler会被自动传入一个 event 对象,这个对象和普通的浏览器 event 对 象所包含的方法和属性都基本一致。不同的是 React中的 event 对象并不是浏览器提供的,而是它自 己内部所构建的。它同样具有 event.stopPropagation 、 event.preventDefault 这种常用的方法。

4.ref的应用

4.1给标签设置ref="username"    (不推荐)

通过这个获取this.refs.username , ref可以获取到应用的真实dom

 <input ref="username"></input><button onClick={()=>{console.log("开始1",this.refs.username);}}>添加</button>

所以获取输入框的值可以  this.refs.username.value

 <button onClick={()=>{console.log("开始1",this.refs.username.value);}}>添加</button>

4.2 新的写法  (推荐)

React.createRef()

export default class BindAPP extends Component {myref=React.createRef();render() {return (<section><div>事件绑定</div><div><input ref={this.myref}></input><button onClick={() => {console.log("开始1", this.myref);}}>添加</button></div></section>)}}

input对象在current   因此   可以通过 this.myref.current.value 获取输入框的值

5.组件的数据挂载方式

5.1 状态state初体验

状态就是组件描述某种显示情况的数据,由组件自己设置和更改,也就是说由组件自己维护,使用状态 的目的就是为了在不同的状态下使组件的显示不同(自己管理)

错误写法:一般我们会想到定义一个变量  然后使用这个变量  然后点击按钮触发  修改这个变量的值

import React, { Component } from 'react'export default class App extends Component {render() {var text="收藏";return (<div><h1>欢迎来到react世界</h1><button onClick={()=>{text="取消收藏"}}>{text}</button></div>)}
}

前台显示我们会发现并没有起作用

需要使用state状态  和setState

import React, { Component } from 'react'export default class App extends Component {state={text:"收藏"}render() {// var text="收藏";return (<div><h1>欢迎来到react世界</h1><button onClick={()=>{this.setState({text:"取消收藏"})}}>{this.state.text}</button></div>)}
}

import React, { Component } from 'react'export default class App extends Component {state={myshow:true}render() {// var text="收藏";return (<div><h1>欢迎来到react世界</h1><button onClick={()=>{this.setState({myshow: !this.state.myshow})if(this.state.myshow){//收藏//执行收藏的逻辑  比如给后端发请求保存收藏的状态值}}}>{this.state.myshow?"收藏":"取消收藏"}</button></div>)}
}

另一种写法constructor()

import React, { Component } from 'react'export default class App extends Component {// state={//     myshow:true// }constructor(){super();this.state={myshow:true}}render() {// var text="收藏";return (<div><h1>欢迎来到react世界</h1><button onClick={()=>{this.setState({myshow: !this.state.myshow})if(this.state.myshow){//收藏//执行收藏的逻辑  比如给后端发请求保存收藏的状态值}}}>{this.state.myshow?"收藏":"取消收藏"}</button></div>)}
}

5.2 列表渲染

import React, { Component } from 'react'export default class App extends Component {state={list:["111","222","333"]}render() {return (<div><ul>{this.state.list.map(item=><li>{item}</li>)}</ul></div>)}
}

 成功渲染列表  但是会有一个警告   在列表中的每一个孩子应该有一个不同的key属性

设置key的原因是让react精准知道操作哪个

 为了列表的复用和重排,设置key值,提高性能

理想的key是独一无二的   一般设置为对象中的id


import React, { Component } from 'react'export default class App extends Component {state={// list:["111","222","333"]list:[{id:1,text:"111"},{id:2,text:"222"},{id:3,text:"333"},]}render() {return (<div><ul>{this.state.list.map(item=><li key={item.id}>{item.text}</li>)}</ul></div>)}
}

当然,如果只是为了将列表进行渲染显示,不需要进行增删,可以使用index


import React, { Component } from 'react'export default class App extends Component {state={// list:["111","222","333"]list:[{id:1,text:"111"},{id:2,text:"222"},{id:3,text:"333"},]}render() {return (<div><ul>{this.state.list.map((item,index)=><li key={index}>{item.text}-----{index}</li>)}</ul></div>)}
}

6.案例tolist增加和删除

6.1 增加


import React, { Component } from 'react'export default class App extends Component {constructor() {super();this.state = {addList: [{id: Date.parse(new Date()), title: "张三"}]}}myref = React.createRef();render() {return (<div><input ref={this.myref}></input><button onClick={() => {this.handler()}}>增加</button><ul>{this.state.addList.map((item) =><li key={item.id}>{item.id}----{item.title}</li>)}</ul></div>)}handler = () => {let newList = [...this.state.addList]newList.push({id: Date.parse(new Date()),title: this.myref.current.value})this.setState({addList: newList}) }
}

6.2 删除


import React, { Component } from 'react'export default class App extends Component {constructor() {super();this.state = {addList: [{id: Math.random()*10000, title: "张三"}]}}myref = React.createRef();render() {return (<div><input ref={this.myref}></input><button onClick={() => {this.handler()}}>增加</button><ul>{this.state.addList.map((item,index) =><li key={item.id}>{item.id}----{item.title}<button onClick={()=>{this.deleteList(index)}}>删除</button></li>)}</ul></div>)}handler = () => {let newList = [...this.state.addList]newList.push({id: Math.random()*10000,title: this.myref.current.value})this.setState({addList: newList}) }deleteList=(index)=>{console.log(index);let newList = [...this.state.addList];newList.splice(index,1);//从该下标开始删除  删除一个this.setState({addList: newList})}
}

优化:

1.输入框输入后,点击按钮, 应该自动清空输入框的值,避免每次重新输入还需要删;
 

this.myref.current.value=""

2.删除到一个都不剩的时候,一片空白,应该显示一个空空如也;

如果为空就..........................

条件渲染

 {this.state.addList.length==0 ?<div>暂无待办事项</div>:null}

换种写法:(推荐)

 {this.state.addList.length===0 && <div>暂无待办事项</div>}

条件为真就显示渲染  为假就移除

7.dangerouslySetInnerHTML

意思就是输入框中如果输入的是富文本,需要输出并解析

dangerouslySetInnerHTML顾名思义,危险的设置html 

固定写法{__html:}    注意是双下划线

  {/* {item.id}----{item.title} */}<span dangerouslySetInnerHTML={{__html:item.id+"------"+item.title}}></span>

import React, { Component } from 'react'export default class App extends Component {constructor() {super();this.state = {addList: [{id: Math.random()*10000, title: "张三"}]}}myref = React.createRef();render() {return (<div><input ref={this.myref}></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.myref.current.value})this.setState({addList: newList}) this.myref.current.value=""}deleteList=(index)=>{console.log(index);let newList = [...this.state.addList];newList.splice(index,1);//从该下标开始删除  删除一个this.setState({addList: newList})}
}

 

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

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

相关文章

Spring Scope

Spring中五种 Scope域 singleton&#xff0c;容器启动时创建&#xff08;未设置延迟&#xff09;&#xff0c;容器关闭时销毁【单例】prototype&#xff0c;每次使用时创建&#xff0c;不会自动销毁&#xff0c;需要调用 DefaultListableBeanFactory.destroyBean(bean) 销毁【…

sqlserver 存储过程当中如何实现增删改查

--声明存储过程 新增编辑 ALTER procedure [dbo].[Eng_MyAddOrEdtADPro] My_Cocode int, Type int, -- --1 新增 2 编辑 My_KeyId uniqueidentifier, My_PCode int, My_SCode int, My_PName nvarchar(36), My_SName nvarchar(36), My_Orde…

OpenCV for Python 学习第三天 :图片处理之NumPy库与OpenCV相结合

上一篇博客我们了解了图像在OpenCV中的保存方式。并且我们自己上手创建了一张灰度图像和一张彩色图像。除此之外&#xff0c;我们还了解到了彩色图像通道在OpenCV中和我们日常所了解的不一样&#xff0c;是通过BGR的顺序进行编码的。咱们一定要记清楚哦~ 那么今天&#xff0c;我…

基于单片机心率脉搏心率血压体温血氧检测系统的设计与实现

功能介绍 本次设计通过32系列单片机STM32进行数据处理&#xff0c;配置引脚和JFC103传感器以及温度传感器进行数据通信。采用防水DS18B20进行腋下温度采集&#xff0c;通过单总线方式进行数据传输。心率血氧血压模块通过串口通信方式把采集到的数据发送给单片机&#xff0c;所有…

【前端知识】JavaScript——var 与 let 的区别

【前端知识】JavaScript——var 与 let 的区别 var声明的变量会自动提升到函数作用域顶部&#xff0c;而let不会。 在解析代码时&#xff0c;JavaScript 引擎会注意出现在块后面的 let 声明&#xff0c;只不过在此之前不能以任何方式来引用未声明的变量。在 let 声明之前的执行…

MySQL-DQL-案例

案例 案例1 根据需求完成员工管理的条件分页查询 具体代码 -- 案例1&#xff1a;按需求完成员工管理的条件分页查询 - 根据输入条件&#xff0c;查询第一页数据&#xff0c;每页展示10条记录 -- 输入条件&#xff1a; -- 姓名&#xff1a;张 -- 性别&#xff1a;男 -- 入职时间…

NAT 地址转换路由器配置命令(华为路由器)

#AR1路由器配置 # acl 2000 rule permit source any # interface GigabitEthernet0/0/1 nat outbound 2000 ip address 1.1.1.1 24 # interface GigabitEthernet0/0/0 ip address 172.16.1.1 255.255.255.0 # ip route-static 0.0.0.0 0.0.0.0 1.1.1.2 ip route-static …

怎么进行流程图制作?分享几种绘制方法

怎么进行流程图制作&#xff1f;流程图是一种图形化表示流程的图表&#xff0c;通常用于描述业务、计划或工作流程。它可以帮助人们更好地理解复杂的流程&#xff0c;并且提供了一种清晰的方法来记录和共享流程信息。下面介绍一些绘制流程图的方法&#xff0c;可以帮助我们快速…

Authing 入选长城战略咨询《2023 中国潜在独角兽企业》报告

2023 年 6 月 20 日&#xff0c;长城战略咨询&#xff08;GEI&#xff09;发布《2023 中国潜在独角兽企业研究》报告。Authing 作为国内首家身份云&#xff08;IDaaS&#xff09;厂商入选中国潜在独角兽企业榜单。独角兽企业指具有发展速度快、数量稀少、备受投资者青睐等属性的…

react 初学(1)

1.安装环境 需要Node.js 自行下载安装 然后全局安装create-react-app npm install -g create-react-app 如果出现报错请参考 create-react-app -V 报错无法将“create-react-app”项识别为 cmdlet、函数、脚本文件或可运行程序的名称_Java-请多指教的博客-CSDN博客 2.创建…

HTTP1.1、HTTPS、HTTP2.0 、HTTP3.0

HTTP1.1 优点&#xff1a; 整体方面&#xff1a;简单、灵活和易于扩展、应用广泛和跨平台 性能方面&#xff1a;长连接、管道网络传输解决请求队头阻塞&#xff08;没有使用&#xff09; 缺点&#xff1a; 安全方面&#xff1a;无状态、明文窃听、伪装、篡改 性能方面&am…

【NLP】多头注意力概念(02)

接上文: 【NLP】多头注意力概念(01) 五、计算注意力 将 Q、K 和 V 拆分为它们的头部后,现在可以计算 Q 和 K 的缩放点积。上面的等式表明,第一步是执行张量乘法。但是,必须先转置 K。 展望未来,每个张量的seq_length形状将通过其各自的张量来识别,以确保清晰…