• react基础--JSX、条件渲染、事件处理


    React 是一个用于构建用户界面的 JavaScript 库。

    React 几个特点

    1. 声明式编码

      div.style.background = 'yellowgreen'
      setColor('yellowgreen')
      
    2. 组件化编码

      • 将一个较大较复杂的界面拆分成几个可复用的部分封装成多个组件, 再组合使用

      • 组件可以被反复使用

    3. 引入了 JSX 语法,编写高效

    4. 内置 diff 算法,运行高效

    5. 一次学习,随处编写

      • 不仅可以开发 web 应用(react-dom),还可以开发原生安卓或 IOS 应用(react-native)

     

    React基本使用

    1. 引入两个JS文件( 注意引入顺序 )  

    <!-- react库, 提供React对象 -->
    <script src="../js/react.development.js"></script>
    <!-- react-dom库, 提供了ReactDOM对象 -->
    <script src="../js/react-dom.development.js"></script> 

    2. 在html定义一个根容器标签

    <div id="root"></div> 

    3. 创建react元素(类似html元素)

    // 返回值:React元素 
    // 参数1:要创建的React元素名称 =》字符串
    // 参数2:元素的属性  =》对象 {id: 'box'} 或者 null
    // 后面参数:该React元素的所有子节点 =》文本或者其他react元素
    const element = React.createElement(
      'h1', 
      {title: '你好, React!'}, 
      'Hello React!'

    4. 渲染 react 元素

     // 渲染React元素到页面容器div中
    ReactDOM.render(element, document.getElementById('root'))

    特殊属性:class ==> className

    1. const element = React.createElement(
    2. 'h1',
    3. {
    4. title: '你好, React!',
    5. className: 'active'
    6. },
    7. 'Hello React!'
    8. )
    1. const title = '北京疫情'
    2. const content = '北京这段时间疫情还在持续中...'
    3. const vDom = React.createElement('div', null,
    4. React.createElement('h2', {title}, '你关注的北京疫情'),
    5. React.createElement('p', null, content)
    6. )
    7. ReactDOM.render(vDom, document.getElementById('root2'))

    理解 React 元素

    1. 也称虚拟 DOM (virtual DOM) 或虚拟节点(virtual Node)

    2. 它就是一个普通的 JS 对象, 它不是真实 DOM 元素对象

      虚拟 DOM: 属性比较少 ==> 较轻的对象

      真实 DOM: 属性特别多 ==> 较重的对象

    3. 但它有一些自己的特点

      虚拟 DOM 可以转换为对应的真实 DOM => ReactDOM.render方法将虚拟DOM转换为真实DOM再插入页面

      虚拟 DOM 对象包含了对应的真实 DOM 的关键信息属性

      属性示例
      标签名type: "h1"
      标签属性props: {title: '你好, React!'}
      子节点props: {children: 'Hello React!'}

     

    JSX

    基本理解和使用

    问题: React.createElement() 写起来太复杂了

    解决: 推荐使用更加简洁的JSX

    JSX 是一种 JS 的扩展语法, 用来快速创建 React 元素(虚拟DOM/虚拟节点)

    形式上像 HTML 标签/任意其它标签, 且标签内部是可以套 JS 代码的

    浏览器并不认识 JSX 所以需要引入babel将 JSX 编译成 React.createElement 的形式

    1. <!-- 必须引入编译jsx的babel库 -->
    2. <script src="../js/babel.min.js"></script>
    3. <!-- 必须声明type为text/babel, 告诉babel对内部的代码进行jsx的编译 -->
    4. <script type="text/babel">
    5. // 创建React元素 (也称为虚拟DOM 或 虚拟节点)
    6. const vDom = <h1 title="你好, React2!" className="active">Hello React2!</h1>
    7. // 渲染React元素到页面容器div中
    8. ReactDOM.render(vDom, document.getElementById('root'))
    9. </script>

    注意:

    必须有结束标签;整个只能有一个根标签;空标签可以自闭合

    JSX 中使用 JS 表达式

     JSX 中使用 JS 表达式的语法:{}

    作用: 指定动态的属性值和标签文本

    1. 可以是任意基本类型数据值, 但 null、undefined 和布尔值没有任何显示

    2. 子元素可以是一个 JS 数组, 但不能是 JS 对象

    3. style 属性值必须是一个包含样式的 JS 对象

    4. 可以是 JS 的表达式, 不能是 JS 的语句

    5. 可以是 react 元素对象

    1. let title = 'I Like You'
    2. const vNode = (
    3. <div>
    4. <h3 name={title}>{title.toUpperCase()}</h3>
    5. <h3>{3}</h3>
    6. <h3>{null}</h3>
    7. <h3>{undefined}</h3>
    8. <h3>{true}</h3>
    9. <h3>{'true'}</h3>
    10. <h3>{React.createElement('div', null, 'atguigu')}</h3>
    11. <h3>{[1, 'abc', 3]}</h3>
    12. <h3 title={title} id="name" className="ative" style={{color: 'red'}}></h3>
    13. {/* <h3>{{a: 1}}</h3> */}
    14. </div>
    15. )

    样式处理

    行内样式

    • 样式属性名使用小驼峰命名法

    • 如果样式是数值,可以省略单位

    <h2 style={{color: 'red', fontSize: 30}}>React style</h2>

    类名

    • 必须用 className, 不能用 class

    • 推荐, 效率更高些

    <h2 className="title">React class</h2>

     

    条件渲染

    if...else

    1. let vDom
    2. if (isLoading) {
    3. vDom = <h2>正在加载中...</h2>
    4. } else {
    5. vDom = <div>加载完成啦!</div>
    6. }
    7. ReactDOM.render(vDom, document.getElementById('root'))

    三元表达式

    1. const vDom = isLoading ? <h2>正在加载中2...</h2> : <div>加载完成啦2!</div>
    2. ReactDOM.render(vDom, document.getElementById('root'))

    &&

    1. const vDom = isLoading && <h2>正在加载中3...</h2>
    2. ReactDOM.render(vDom, document.getElementById('root'))
    3. // 注意: 只适用于只在一种情况下才有界面的情况

    表达式1 && 表达式2

    如果表达式1对应的boolean为true, 返回表达式2的值

    如果表达式1对应的boolean为false, 返回表达式1的值

    表达式1 || 表达式1

    如果表达式1对应的boolean为true, 返回表达式1的值

    如果表达式1对应的boolean为false, 返回表达式2的值

    列表渲染

    • react中可以将数组中的元素依次渲染到页面上

    • 可以直接往数组中存储react元素

    • 推荐使用数组的 map 方法

    • 注意:必须给列表项添加唯一的 key 属性, 推荐使用id作为key, 尽量不要用index作为key

    需求: 根据下面的数组显示列表

    const courses = [ {id: 1, name: 'React'}, {id: 3, name: 'Vue'}, {id: 5, name: '小程序'} ]

    1. const courses = [
    2. {id: 1, name: 'React'},
    3. {id: 3, name: 'Vue'},
    4. {id: 5, name: '小程序'}
    5. ]
    6. const vDom = (
    7. <div>
    8. <h2>前端框架课程列表</h2>
    9. <ul>
    10. {courses.map(c => <li key={c.id}>{c.name}</li>)}
    11. </ul>
    12. </div>
    13. )
    14. ReactDOM.render(vDom, document.getElementById('root'))

    事件处理

    绑定事件

    React 元素的事件处理和 DOM 元素的很相似,但是有一点语法上的不同:

    • React 事件的命名采用小驼峰式(camelCase),而不是纯小写。比如:onClick、onFocus 、onMouseEnter

    • 使用 JSX 语法时你需要传入一个函数作为事件处理函数,而不是一个字符串

          const div = <div onClick={事件处理函数}></div>

    事件对象

    React 根据 W3C 规范来自定义的合成事件, 与原生事件不完全相同

    • 处理好了浏览器的兼容性问题

    • 阻止事件默认行不能使用 return false, 必须要调用: event.preventDefault()

    • 有自己特有的属性, 比如: nativeEvent -- 原生事件对象

    • <input>的 change 监听在输入过程中触发, 而原生是在失去焦点才触发

      • 原理:内部绑定的是原生 input 事件

    1. function handleClick1(event) {
    2. console.log(event)
    3. alert(event.target.innerHTML)
    4. }
    5. const handleClick2 = (event) => {
    6. const isOdd = Date.now()%2===1
    7. alert(isOdd)
    8. if (!isOdd) {
    9. // return false // 不起作用
    10. event.preventDefault()
    11. }
    12. }
    13. const vDom = <div>
    14. <button onClick={handleClick1}>点击提示按钮文本</button>
    15. <br/>
    16. <br/>
    17. <a href="http://www.baidu.com" onClick={handleClick2}>奇数才去百度</a>
    18. </div>
    19. ReactDOM.render(vDom, document.getElementById('root'))

     

     

     

  • 相关阅读:
    node爬取掘金/csdn文章
    OKHTTP:Cookie在okhttp中的原理
    【无标题】
    Docker Compose使用
    【C++学习笔记】静态多态与动态多态
    实现bubble_sort冒泡排序函数,排序任意类型数据
    5分钟,带你看完24岁60W年薪架构师的简历,上面竟然写着精通JVM
    【java基础系列】12- java的数组(二)
    《数据结构》(六)八大排序(下)
    计算机毕业设计 SSM老年公寓管理系统 养老院公寓管理系统 公寓住宿信息管理系统Java Vue MySQL数据库 远程调试 代码讲解
  • 原文地址:https://blog.csdn.net/m0_60376759/article/details/125508319