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.mzph.cn/news/3551.shtml

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

相关文章

数据库信息速递 MONGODB 6.0 的新特性,更多的查询函数,加密查询,与时序数据集合 (译)...

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到3群&#xff08;共…

Spring实现文件上传,文件上传

第一步&#xff1a;创建jsp文件 创建form表单 提交文件是post 文件上传的表单 服务端能不能获得数据&#xff0c;能 实现单文件上传的步骤&#xff1a; 导入相应的坐标&#xff1a;在pom.xml文件中进行导入 再导入这份&#xff1a; 第二步&#xff0c;在spring-MVC的上传中去配…

2023云曦期末复现

目录 WEB sign SSTI serialize WEB sign 有10000个 进行bp爆破 能发现 410 和 414长度 还有 420 410 414存在16进制的字符 拼凑出来为 \x66\x6c\x61\x67\x7b\x61\x63\x63\x39\x39\x66\x39\x30\x34\x66\x30\x65\x61\x66\x61\x34\x31\x63\x30\x36\x34\x33\x36\x38\x31\x3…

less 笔记

1 margin-left 之后有 margin: 0 导致margin-left 无效 --> 不能重复定义 .btn-group {margin-left: calc(100% - 350px);display: inline-block;margin: 0; // 重复定义 导致上面 没有效果padding: 0; } 2 一定要F12检查元素 看各个div的宽度是否太长 导致靠左靠右 计算不…

数据库锁机制

锁机制 1. 概述2. 并发事务的不同场景2.1 读-读情况2.2 写-写情况2.3 读-写或写-读情况2.3.1 方案一&#xff1a;读事务使用MVCC&#xff08;多版本并发控制&#xff09;&#xff0c;写事务加锁2.3.2 方案二&#xff1a;读、写事务均加锁 3. 锁分类3.1 从数据操作类型&#xff…

MySQL学习笔记

文章目录 1、登录2、查看数据库3、连接数据库4、查看表5、退出6、创建/删除数据库7、创建表8、数据类型9、查看表中的内容10、向表中插入数据11、约束主键&#xff1a;主键&#xff08;PRIMARY KEY&#xff09;作为数据表中一行数据的唯一标识符&#xff0c;在一张表中通过主键…

e2e测试框架之Cypress

谈起web自动化测试&#xff0c;大家首先想到的是Selenium&#xff01;随着近几年前端技术的发展&#xff0c;出现了不少前端测试框架&#xff0c;这些测试框架大多并不依赖于Selenium&#xff0c;这一点跟后端测试框架有很大不同&#xff0c;如Robot Framework做Web自动化测试本…

CVE-2013-4547

CVE-2013-4547 一、环境搭建二、漏洞原理三、漏洞复现 一、环境搭建 如下介绍kali搭建的教程 cd ~/vulhub/nginx/CVE-2013-4547 // 进入指定环境 docker-compose build // 进行环境编译 docker-compose up -d // 启动环境docker-compose ps使用这条命令查看当前正在运…

Redis学习(三)持久化机制、分布式缓存、多级缓存、Redis实战经验

文章目录 分布式缓存Redis持久化RDB持久化AOF持久化 Redis主从Redis数据同步原理全量同步增量同步 Redis哨兵哨兵的作用和原理sentinel&#xff08;哨兵&#xff09;的三个作用是什么&#xff1f;sentinel如何判断一个Redis实例是否健康&#xff1f;master出现故障后&#xff0…

AI 智能对话 - 基于 ChatGLM2-6B 训练对话知识库

前情提要 怎么将 AI 应用到工作中呢&#xff1f;比如让 AI 帮忙写代码&#xff0c;自己通过工程上的思维将代码整合排版&#xff0c;我挺烦什么代码逻辑严谨性的问题&#xff0c;但是我又不得不承认这样的好处&#xff0c;我们要开始将角色转换出来&#xff0c;不应该是一个工…

Ceph部署

目录 1、存储基础 单机存储设备 单机存储的问题 分布式存储&#xff08;软件定义的存储 SDS&#xff09; 分布式存储的类型 2、Ceph 简介 3、Ceph 优势 4、Ceph 架构 5、Ceph 核心组件 Pool中数据保存方式支持两种类型&#xff1a; Pool、PG 和 OSD 的关系&#xff…

功能丰富的 Markdown 笔记工具:FSNotes Mac中文版图文安装教程

FSNotes Mac版是Mac平台上一款纯文本笔记本管理器&#xff0c;FSNotes for mac中文版支持Markdown、RTF等格式&#xff0c;轻松查看和编辑数据&#xff0c;还可以将数据存储在文件系统中&#xff0c;同时具备iCloud同步功能&#xff0c;使用非常便捷。 FSNotes for mac官方介绍…

自动化测试转型挑战及其解决方案

目录 前言&#xff1a; 自动化测试挑战 选择合适的自动化测试方法 选择正确的自动化工具 整理数据 何时开始和停止 如何克服挑战 前言&#xff1a; 自动化测试的转型是许多组织在提高测试效率和质量方面的重要举措。然而&#xff0c;这个转型过程中可能会面临一些挑战。…

Java 装箱拆箱原理 包装类型缓存池

JAVA中的基本数据类型 byteshortintlongfloatdoublebooleanchar 为了让上述基本数据类型可以转为对象&#xff0c;Java在1.5推出了一系列包装类&#xff0c;基本类和包装类互相转换的过程&#xff0c;称为装箱和拆箱 缓存池 缓存池也叫常量池。它是事先存储一些常量数据用以…

优化营商环境:构建智能营销平台,助力企业经营发展

对于企业来说&#xff0c;没有了客户&#xff0c;就像身体没有了血液&#xff0c;将失去生命力和活力&#xff0c;续存难发展更难。区域产业又是由一个个企业集聚而形成&#xff0c;企业的成败也就决定着区域产业的兴衰。 在当今竞争激烈的商业环境中&#xff0c;传统的销售手段…

MongoDB初体验-安装使用教程2023.7

前言&#xff1a;博主第一次接触MongoDB&#xff0c;看了一圈网上现有的教程&#xff0c;不是缺少细节就是有问题没交代清楚&#xff0c;特整理了一下自己安装运行的过程&#xff0c;从下载安装到开机自启&#xff0c;全程细节齐全、图文并茂、简单易懂。 目录 1. 从官网下载2…

基于遗传算法的新能源电动汽车充电桩与路径选择MATLAB程序

主要内容&#xff1a; 根据城市间的距离&#xff0c;规划新能源汽车的行驶路径。要求行驶距离最短。 部分代码&#xff1a; %% 加载数据 %%遗传参数 load zby;%个城市坐标位置 NIND50; %种群大小 MAXGEN200; Pc0.9; %交叉概率 Pm0.2; %变异概率 GGAP0.…

巩固一下NodeJs

1、初始化(确保当前电脑有node环境) npm init 2、安装express npm i expressnpm i ws文件结构 3、编写相关代码启动node服务(server.js) //导入下列模块&#xff0c;express搭建服务器&#xff0c;fs用来操作文件、ws用来实现webscoket const express require("expr…

C++进阶—C++11新特性(移动语义右值引用可变参数模板lambda表达式function包装器bind函数)

目录 0. C11简介 1. 统一的列表初始化 1.1 {}初始化 1.2 std::initializer_list 2. 声明 2.1 auto 2.2 decltype 2.3 nullptr 3. 范围for循环 4. 智能指针 5. STL中一些变化 6. 右值引用和移动语义 6.1 左值引用和右值引用 6.2 左值引用与右值引用比较 6.3 右值…

PSP - Jackhmmer 搜索 EMBL 序列数据库的相似序列

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131817060 EMBL (European Molecular Biology Laboratory&#xff0c;欧洲分子生物实验室)&#xff1a;EMBL 数据库是一个由欧洲生物信息学研究所…