JSX详解React的事件绑定事件参数的传递

一、认识JSX

在这里插入图片描述
这段element变量的声明右侧赋值的标签语法是什么呢?

  • 它不是一段字符串(因为没有使用引号包裹),它看起来是一段HTML原生,但是我们能在js中直接给一个变量赋值html吗?
  • 其实是不可以的,如果我们讲 type=“text/babel” 去除掉,那么就会出现语法错误;
  • 它到底是什么呢?其实它是一段jsx的语法;

JSX是什么?

  • JSX是一种JavaScript的语法扩展(eXtension),也在很多地方称之为JavaScript XML,因为看起就是一段XML语法;
  • 它用于描述我们的UI界面,并且其完成可以和JavaScript融合在一起使用;
  • 它不同于Vue中的模块语法,你不需要专门学习模块语法中的一些指令(比如v-for、v-if、v-else、v-bind);

为什么React选择了JSX?

React认为渲染逻辑本质上与其他UI逻辑存在内在耦合

  • 比如UI需要绑定事件(button、a原生等等);
  • 比如UI中需要展示数据状态,在某些状态发生改变时,又需要改变UI; n 他们之间是密不可分,所以React没有讲标记分离到不同的文件中,而是将它们组合到了一起,这个地方就是组件
    (Component);
  • 我们只需要知道,JSX其实是嵌入到JavaScript中的一种结构语法;

JSX的书写规范:

  • JSX的顶层只能有一个根元素,所以我们很多时候会在外层包裹一个div原生(或者使用后面我们学习的Fragment);
  • 为了方便阅读,我们通常在jsx的外层包裹一个小括号(),这样可以方便阅读,并且jsx可以进行换行书写;
  • JSX中的标签可以是单标签,也可以是双标签;
    注意:如果是单标签,必须以/>结尾;

二、JSX的使用

jsx中的注释

在这里插入图片描述

JSX嵌入变量

  • 情况一:当变量是Number、String、Array类型时,可以直接显示

  • 情况二:当变量是null、undefined、Boolean类型时,内容为空; 如果希望可以显示null、undefined、Boolean,那么需要转成字符串; 转换的方式有很多,比如toString方法、和空字符串拼接,String(变量)等方式;
    在这里插入图片描述

  • 情况三:对象类型不能作为子元素(not valid as a React child)
    在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"></div><script src="../react/react.development.js"></script><script src="../react/react-dom.development.js"></script><script src="../react/babel.min.js"></script><script type="text/babel">class App extends React.Component {constructor(props) {super(props);this.state = {// 1.在{}中可以正常显示显示的内容name: "why", // Stringage: 18, // Numbernames: ["abc", "cba", "nba"], // Array// 2.在{}中不能显示(忽略)test1: null, // nulltest2: undefined, // undefinedtest3: true, // Booleanflag: true,// 3.对象不能作为jsx的子类//   friend: {//     name: "kobe",//     age: 40//   }}}render() {return (<div><h2>{this.state.name}</h2><h2>{this.state.age}</h2><h2>{this.state.names}</h2><h2>{this.state.test1 + ""}</h2><h2>{this.state.test2 + ""}</h2><h2>{this.state.test3.toString()}</h2><h2>{this.state.flag ? "你好啊": null}</h2><h2>{this.state.friend}</h2></div>)}}ReactDOM.render(<App/>, document.getElementById("app"));</script></body>
</html>

JSX嵌入表达式

  • 运算表达式
  • 三元运算符
  • 执行一个函数
    在这里插入图片描述

jsx绑定属性

  • 比如元素都会有title属性
  • 比如img元素会有src属性
  • 比如a元素会有href属性
  • 比如元素可能需要绑定class
  • 比如原生使用内联样式style
    在这里插入图片描述
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><div id="app"></div><div style="color: red; font-size: 30px;"></div><script src="../react/react.development.js"></script><script src="../react/react-dom.development.js"></script><script src="../react/babel.min.js"></script><script type="text/babel">function getSizeImage(imgUrl, size) {return imgUrl + `?param=${size}x${size}`}class App extends React.Component {constructor(props) {super(props);this.state = {title: "标题",imgUrl: "http://p2.music.126.net/L8IDEWMk_6vyT0asSkPgXw==/109951163990535633.jpg",link: "http://www.baidu.com",active: true}}render() {const { title, imgUrl, link, active } = this.state;return (<div>{/* 1.绑定普通属性 */}<h2 title={title}>我是标题</h2><img src={getSizeImage(imgUrl, 140)} alt=""/><a href={link} target="_blank">百度一下</a>{/* 2.绑定class */}<div className="box title">我是div元素</div><div className={"box title " + (active ? "active": "")}>我也是div元素</div><label htmlFor=""></label>{/* 3.绑定style */}<div style={{color: "red", fontSize: "50px"}}>我是div,绑定style属性</div></div>)}}ReactDOM.render(<App />, document.getElementById("app"));</script>
</body></html>

三、React事件绑定

如果原生DOM原生有一个监听事件,我们可以如何操作呢?
方式一:获取DOM原生,添加监听事件;
在这里插入图片描述

方式二:在HTML原生中,直接绑定onclick;
在这里插入图片描述

在React中是如何操作呢?
我们来实现一下React中的事件监听,这里主要有两点不同:

  1. React 事件的命名采用小驼峰式(camelCase),而不是纯小写。
    例如原生中的onclick="btnClick",在React中需要写成onClick={btnClick}
  2. 我们需要通过{}传入一个事件处理函数,这个函数会在事件发生时被执行;

在事件执行后,我们可能需要获取当前类的对象中相关的属性,这个时候需要用到this,如果我们这里直接打印this,也会发现它是一个undefined。
在这里插入图片描述

为什么是undefined呢?
原因是btnClick函数并不是我们主动调用的,而且当button按钮被点击时,React内部调用了btnClick函数,而它内部调用时,并不知道要如何绑定正确的this;

如何解决this的问题呢?
方案一:bind给btnClick显式绑定this
在这里插入图片描述
在这里插入图片描述

方案二:定义函数时使用箭头函数,使用 ES6 class fields 语法
在这里插入图片描述

方案三:事件监听时传入箭头函数(推荐)
在这里插入图片描述

四、事件参数传递

在执行事件函数时,有可能我们需要获取一些参数信息:比如event对象、其他参数

情况一:获取event对象

  • 很多时候我们需要拿到event对象来做一些事情(比如阻止默认行为)
  • 假如我们用不到this,那么直接传入函数就可以获取到event对象;
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

情况二:获取更多参数

  • 有更多参数时,我们最好的方式就是传入一个箭头函数,主动执行的事件函数,并且传入相关的其他参数;
  • 在这里插入图片描述

在这里插入图片描述

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><div id="app"></div><button id="btn">原生</button><script src="../react/react.development.js"></script><script src="../react/react-dom.development.js"></script><script src="../react/babel.min.js"></script><script type="text/babel">document.getElementById('btn').addEventListener('click', function (event) {console.log(event);})class App extends React.Component {constructor(props) {super(props)this.state = {movies: ['流浪地球', '温暖的抱抱', '盗梦空间']}this.btnClick = this.btnClick.bind(this)}render() {return (<div><button onClick={this.btnClick}>按钮</button><ul>{this.state.movies.map((item, index, arr) => {return (<li className="item"onClick={(event) => {this.liClick(item, index, event)}} key={index}>{item}</li>)})}</ul></div>)}btnClick(event) {console.log(event);console.log('按钮发生点击', this);}liClick(item, index, event) {console.log('li发生了点击', item, index, event);}}ReactDOM.render(<App />, document.getElementById('app'))</script>
</body></html>

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

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

相关文章

剑指Offer 从尾到头打印链表

题目描述 输入一个链表&#xff0c;从尾到头打印链表每个节点的值。 输入描述: 输入为链表的表头 输出描述: 输出为需要打印的“新链表”的表头 思路&#xff1a; 用容器vector&#xff0c;递归到最后一个元素&#xff0c;push_back到dev中。 AC代码&#xff1a; 1 /**2 * str…

python排序元组两个元素_在python中对具有3个元素的元组列表进行排...

只需对列表进行排序&#xff1b;默认排序功能可以满足您的需求.比较两个元组时,将根据它们的内容对其进行排序&#xff1b;首先对第一个元素进行排序,如果相等,则对第二个元素进行排序,依此类推.演示&#xff1a;>>> L [(14, 2, 3), (1, 14, 0), (14, 1, 1), (1, 14,…

叠积木

【题目描述】 约翰和贝西在叠积木。共有30000块积木&#xff0c;编号为1到30000。一开始&#xff0c;这些积木放在地上&#xff0c;自然地分成N堆。贝西接受约翰的指示&#xff0c;把一些积木叠在另一些积木的上面。一旦两块积木相叠&#xff0c; 彼此就再也不会分开了&#xf…

总谐波失真计算公式_新能源汽车技术|车用轮毂电机转矩谐波协同控制策略

点击 电机与控制应用 关注我们轮毂电机因结构简单、驱动灵活的特点广泛应用于轻型电动车辆。电机运行中存在的齿槽效应、逆变器非线性效应及电流谐波等问题&#xff0c;导致电机电磁转矩波动&#xff0c;影响车辆运行的平顺性。通过电磁转矩谐波分析发现其主要成分为低阶谐波。…

React条件渲染列表渲染

一、React条件渲染 某些情况下&#xff0c;界面的内容会根据不同的情况显示不同的内容&#xff0c;或者决定是否渲染某部分内容&#xff1a; 在vue中&#xff0c;我们会通过指令来控制&#xff1a;比如v-if、v-show&#xff1b;在React中&#xff0c;所有的条件判断都和普通的J…

解决VirtualBox错误:“FATAL:No bootable medium found!”

VirtualBox错误&#xff1a;“FATAL&#xff1a;No bootable medium found!”  用VirtualBox安装系统出现这个错误的几率极高&#xff0c;因为当哥出现同样问题的时候股沟了下”FATAL&#xff1a;No bootable medium found!“出现很多内容&#xff0c;但没一个把问题解决了的…

React事件总线

通过Context主要实现的是数据的共享&#xff0c;但是在开发中如果有跨组件之间的事件传递&#xff0c;应该如何操作呢&#xff1f; 一、安装events 在Vue中我们可以通过Vue的实例&#xff0c;快速实现一个事件总线&#xff08;EventBus&#xff09;&#xff0c;来完成操作&…

字符串最长公共子序列python_求解两个字符串的最长公共子序列

一&#xff0c;问题描述给定两个字符串&#xff0c;求解这两个字符串的最长公共子序列(Longest Common Sequence)。比如字符串1&#xff1a;BDCABA&#xff1b;字符串2&#xff1a;ABCBDAB则这两个字符串的最长公共子序列长度为4&#xff0c;最长公共子序列是&#xff1a;BCBA二…

React中使用ref

一、如何使用ref 在React的开发模式中&#xff0c;通常情况下不需要、也不建议直接操作DOM原生&#xff0c;但是某些特殊的情况&#xff0c;确实需要获取到DOM进行某些操作&#xff1a; 管理焦点&#xff0c;文本选择或媒体播放&#xff1b;触发强制动画&#xff1b;集成第三方…

python合并word表格单元格_python docx模块读取word表格遇到合并单元格时的处理

python docx模块读取word表格遇到合并单元格时的处理python docx模块读取word表格遇到合并单元格时的处理python docx模块读取word表 遇到合并单元格时的处理通过docx模块&#xff0c;读取word里面表格&#xff0c;并进行修改。现在我遇到的表格是这样&#xff1a;里面行&#…

React中的受控组件和非受控组件

一、认识受控组件 在React中&#xff0c;HTML表单的处理方式和普通的DOM元素不太一样&#xff1a;表单元素通常会保存在一些内部的state。 比如下面的HTML表单元素&#xff1a; 这个处理方式是DOM默认处理HTML表单的行为&#xff0c;在用户点击提交时会提交到某个服务器中&…

关于div居中

margin : 100px; margin-left: auto; margin-right: auto; 这样子设置css样式就可以实现一个div居中转载于:https://www.cnblogs.com/jiangjing/p/5764820.html

JavaScrip入门-变量计算%函数

哈 <html> <body> <script>var hello"Hello ";hellohello" world!";var age1161;var age220var ottrue; document.write(helloage1);<!--Hello world!17 因为中间空两行 -->document.write(age1age2);//falsedocument.write(age1 …

摩尔斯电码转换python编码_Morse Code 用Python做个摩斯密码转换器

摩斯密码摩尔斯电码(又译为摩斯密码&#xff0c;Morse code)是一种时通时断的信号代码&#xff0c;通过不同的排列顺序来表达不同的英文字母、数字和标点符号&#xff0c;不同于现代只使用零和一两种状态的二进制代码&#xff0c;它的代码包括五种&#xff1a; 点、划、点和划之…

JS动画 | 用TweenMax实现收集水滴效果

之前在CodePen上接触了TweenMax, 被它能做到的酷炫效果震撼了. (文末放了5个GSAP的效果GIF) 最近要做一个"收集水滴"的动效, 于是就试用了一下TweenMax实现这个效果. 什么是TweenMax TweenMax是GSAP(GreenSock Animation Platform)创作的动画工具库. GSAP的产品除了T…

React中的组件通信——父传子、子传父、Context

0、认识组件间的通信 在开发过程中&#xff0c;我们会经常遇到需要组件之间相互进行通信&#xff1a; 比如App可能使用了多个Header&#xff0c;每个地方的Header展示的内容不同&#xff0c;那么我们就需要使用者传递给Header一些数据&#xff0c;让其进行展示&#xff1b;又比…

python控制步进电机驱动器_树莓派操作案例1-使用python GPIO+TB6612驱动步进电机

原理图:接口说明A控制信号输入------PWMA VM ------电机驱动电压输入端(4.5V-15V)A电机输入端2 ------AIN2 VCC ------逻辑电平输入端(2.7V-5.5V)A电机输入端1 ------AIN1 GND ------ 接地正常工作/待机状态控制端------STBY …

遍历输出所有子视图(View)

传入一个View,可以获取传入视图的所有子视图&#xff0c;写入桌面&#xff0c;可以在火狐浏览器下查看 /*** 程序获得了焦点就会自动调用这个方法(只要程序获得了焦点,所有控件才能接收触摸事件)*/ - (void)applicationDidBecomeActive:(UIApplication *)application {NSStrin…

React ref的转发

在前面学习ref时讲过&#xff0c;ref不能应用于函数式组件&#xff1a; 因为函数式组件没有实例&#xff0c;所以不能获取到对应的组件对象 但是&#xff0c;在开发中我们可能想要获取函数式组件中某个元素的DOM&#xff0c;这个时候我们应该如何操作呢&#xff1f; 方式一&…

python tkinter 输入数字 小数_Python3 tkinter基础 Entry validate isdigit 只能输入数字的输入框...

Python : 3.7.0OS : Ubuntu 18.04.1 LTSIDE : PyCharm 2018.2.4Conda : 4.5.11typesetting : Markdowncode"""Author : 行初心Date : 18-10-1Blog : www.cnblogs.com/xingchuxinGitee : gitee.com/zhichengjiu"""from tkinter import *def test(…