Day3. JSX核心语法二, 跟着Demo掌握JSX中的细节

一. JSX的使用

  • jsx绑定属性
    • 比如元素都会有title属性
    • 当我们的光标放在titile属性上, 会出现一段小东西


      image.png
    • 绑定class比较特殊,因为class在js中是一个关键字,所以jsx中不允许直接写class => 使用className替代
//服务器给我们的是一张很大的图片, img元素大小, 加载一张非常大的图片会有性能问题, 只需要渲染一张小图片, 跟上一些参数大小, 搞一个工具
//jsx非常灵活, JS的东西基本上都可以使用, 如果用的是Vue的语法, 相对图片做一个改变, 用封装的某一个过滤器

//对象的解构语法
const { title, imgUrl } = this.state;
<div>
  {/* 1. 绑定普通属性 */}
  <h2 title={this.state.title}>我是标题</h2>
  <img src={this.state.imgUrl} alt=""/>  //单标签必须以/结尾 alt, 图片没有显示时的文本
  <a href={link} target="_blank">百度一下</a>

  {/* 2. 绑定class */}
  <div className="box title">我是div元素</div>
  <div className{"box title" + (active ? "active" : "")}>我也是div元素</div>

  {/* 3. 绑定style 属性由连接符组成要改成驼峰, 或者加单双引号"font-size" */}
  <div style={{color: "red", fontSize: "50px"}}>我是div,绑定style属性</div>

</div>

<div class=""></div>
真实开发网络请求.png
真实开发中统一处理图片大小.png
image.png

image.png

效果.png

二. React事件绑定

三种方案

  1. 显示绑定(bind绑定this) render函数中this.btnClick.bind(this) 开发中用到的非常少
    1.1 如果有5个按钮, 每次都需要传入? => 直接在构造器里面, 找到BtnClick, 重新做一个赋值this.btnClick = this.btnClick.bind(this);
  2. 定义函数式, 使用箭头函数
    ES6中给对象增加属性, 箭头函数中永远不绑定this, 按照作用域一层层网上找
  3. 直接传入一个箭头函数, 在肩头函数中调用要执行的函数
    <button onClick={() => { console.log(this.decrement() }}>-1</button>
<div>
  <button onClick={this.btnClick}>按钮</button>
</div>

btnClick() {
  console.log("按钮发生点击");

{/* 报错undefined this是undefined, 当前btnClick的函数并不是主动调用, React内部对函数做了一个回调, 传递的参数就是undefined */}
  console.log(this.state.message);
}

increment = () => {
 console.log(this.state.counter) ;
}

decrement(name) {
  console.log(this.state.counter, name);
}
this的undefined.png

三. jsx绑定事件-传递参数

  • event对象, React调用时包装的对象
  • 虚拟DOM, setState, DOM更新, 警告
  • 代码太长了, 包一个(), 代码结构优化
<ul>
  this.state.movies.map((item, index, arr) => {
    return <li onClick={e => { this.liClick(item, index, e) }}>{item}</li>
})
</ul>

liClick() {
  console.log("li发生了点击", item, index);
}
React内部合成的对象.png
开发中常用的方案.png
代码结构优化.png

补充:

  • 按钮发生点击React执行函数onClick.call(undefined, event)
  • bind的优先级大于call


    调用过程1.png

    调用过程2.png

四. React条件渲染

  • 根据某一些条件成立或者不成立, 来决定是否渲染某部分内容
    • 在vue中, 我们会通过指令来控制: 比如v-if、v-show;
    • 在React中, 所有的条件判断都和普通的JavaScript代码一致;
  • 常见的条件渲染的方式有哪些?
  • 方式一: 条件判断语句
  • ES6中箭头函数的规律, 如果只有一个函数体, ()可以省略
  • 方案二: 三目运算符
  • 方案三: 逻辑与
this.state = {
  isLogin: true
}
//1. 通过if判断: 逻辑代码非常多的情况
let welcome = nil;
let btnText = nil
if (this.state.isLogin) {
  welcome = <h2>欢迎回来</h2>
  btnText = "退出";
} else {
    welcome = <h2>请先登录</h2>
    btnText = "登录";
}

return (
  <div>
    {welcome}
    <button onClick={e => this.loginClick()}>{this.state.isLogin ? "退出" : "登录"}</button>
     <h2> {isLogin ?  "你好啊, coderwhy"" : null}</h2>

    { /* 逻辑与: 一个条件不成立, 后面的条件都不会进行判断, 字符串由内容的情况下为真, 作为表达式的结果返回 */ }
     <h2>{ isLogin && "你好啊, Jack" }</h2>
      <h2>标签是否存在
      {isLogin && <h2> "你好啊, Jack" </h2>}
  </div>
)


loginClick() {
  this.setState({
  isLogin: !this.state.isLogin
  })
}
  • 什么是DOM?
    • DOM 是 Document Object Model(文档对象模型)的缩写。下面是MDN对DOM的解释:
      文档对象模型 (DOM) 是HTML和XML文档的编程接口。它提供了对文档的结构化的表述,并定义了一种方式可以使从程序中对该结构进行访问,从而改变文档的结构,样式和内容。
      DOM 将文档解析为一个由节点和对象(包含属性和方法的对象)组成的结构集合。简言之,它会将web页面和脚本或程序语言连接起来。
  • <h2>不显示
  • display的值不写死, 动态的
const titleDisplayValue = isLogin ? "block": "none";
<h2 style={{display: titleDisplayValue}}>你好啊</h2>

五. React列表渲染

  • 真实开发中我们会从服务器请求到大量的数据, 数据会以列表的形式存储
    • 比如各种排行版列表的数据...
  • 在React中并没有像Vue模块语法中的v-for指令, 而且需要我们通过JavaScript代码的方式组织数据, 转成JSX:
  • 如何展示列表呢?
    • map高阶函数;
const nums = [110, 123, 50, 32, 55, 10];
const newNums = nums.filter((item, index, arr) => {
  return item >= 50;
})
console.log(newNums);

const newNums2 = nums.filter((item => {
  return item % 2 === 0;
}))
console.log(newNums2);

// 可读性
this.state.numbers.filter(item => item >= 50).map(item => <li>{item}</li>)

//截取
this.state.numbers.filter(item => item >= 50).slice(0, 3).map(item => {
  return <li>{item}</li>
})
列表渲染示例.png

截取.png

coderwhy的React核心技术与开发实战课程链接

少年~来做同学呀~.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352