• React基础入门知识铺垫


    1.react特点

    ①声明式编码

    组件化编码

    ③React Native 编写原生应用

    ④高效(优秀的diffing算法)

    ⑤用于动态构建用户界面的js库(只关注视图)

    2.React高效的原因

    ①使用虚拟DOM,不总是直接操作页面真实的DOM

    ②Diffing算法,最小化页面重绘

    3.jsx

    ①全称:javaScript XML,react定义的一种类似于XML的js扩展语法:js+XML,

    最终解析为js

    ②作用:用来简化创建虚拟DOM

    jsx语法规则:

    ①定义虚拟DOM时,不要写引号。

    ②标签中混入js表达式时要用{}

    ③样式的类名指定使用className

    ④内联样式,要用style={{key:value}}的形式去写。

    ⑤只有一个根标签,并且标签必须闭合

    (1)若小写字母开头,则将改标签转为html中同名元素,若html中无该标签对应的同名元素,则保持。

    (2)若大写字母开头,react就去渲染对应的组件,若组件没有定义,则报错。

    4.函数组件和类组件的基本区别

    类组件有生命周期,函数组件没有

    类组件需要继承 Class,函数组件不需要

    类组件可以获取实例化的 this,并且基于 this 做各种操作,函数组件不行

    类组件内部可以定义并维护 state, 函数组件为无状态组件(可以通过hooks实现)

    函数组件相比较类组件,优点是更轻量与灵活,便于逻辑的拆分复用。
    类组件使用:

    1. import React, { Component } from 'react'
    2. // 定义类组件
    3. export default class ClassHanshu extends Component {
    4. // 1.类中的构造器不是必须要写的,要对实例进行一些初始化的操作,如添加指定属性时才写
    5. // 2.类中所定义的方法,都放在了类的原型对象上,供实例使用
    6. // 3.如果A类继承了B类,且A类中写了构造器,那么A类构造器中的super是必须调用的
    7. constructor() {
    8. super()
    9. this.state = {
    10. flag: true,
    11. count: 0
    12. }
    13. }
    14. addCount() {
    15. //constructor中的state不能直接修改
    16. this.setState({
    17. count: this.state.count += 1
    18. })
    19. }
    20. changeText() {
    21. this.setState({
    22. flag: !this.state.flag
    23. })
    24. }
    25. render() {
    26. // 解构
    27. const { flag, count } = this.state
    28. console.log(flag);
    29. return (
    30. <div>CountClass
    31. {/* 此处的this.state就不用再写了 */}
    32. <p onClick={() => this.changeText()}>ad{flag ? "a" : "d"}p>
    33. <button onClick={() => this.addCount()}>{count}button>
    34. div>
    35. )
    36. }
    37. }

    类组件中的state属性:

    1.state是组件对象最重要的属性,值是对象

    2.组件被称为“状态机”,通过更新组件的state来更新对应的页面显示

    注意:

    1.组件中render方法中的this为组件的实例对象

    2.当组件自定义方法中的this为undefined时,可以通过函数对象的bind()强制绑定this或箭头函数

    3.状态数据,不能直接修改或更新

    5.ref的三种使用方法

    1. import React, { Component } from 'react'
    2. export default class ClassHanshu extends Component {
    3. constructor() {
    4. super()
    5. }
    6. showData() {
    7. // js写法
    8. // const btn = document.getElementById("btn")
    9. // console.log(btn.value);
    10. // console.log(this.refs.value);拿不到数据
    11. // 解构 字符串ref用法
    12. // const { btn } = this.refs
    13. // console.log(btn.value);
    14. }
    15. showData1() {
    16. // 回调ref
    17. const { btn } = this
    18. alert(btn.value)
    19. }
    20. render() {
    21. return (
    22. <div>
    23. {/* 1.字符串ref的使用 */}
    24. {/* <input id="btn" type="text" placeholder='点击按钮提示数据' />
    25. <button onClick={() => this.showData()}>点击打印数据button> */}
    26. {/* <input ref="btn" type="text" placeholder='点击按钮提示数据' />
    27. <button onClick={() => this.showData()}>点击打印数据button> */}
    28. {/* 2.回调ref */}
    29. <input ref={c => this.btn = c} type="text" placeholder='点击按钮提示数据' />
    30. <button onClick={() => this.showData1()}>点击打印数据button>
    31. div>
    32. )
    33. }
    34. }
    1. import React, { Component } from 'react'
    2. export default class ClassHanshu extends Component {
    3. constructor() {
    4. super()
    5. // 3.createRef API方式
    6. // React.createRef调用后可以返回一个容器,该容器可以存储被ref所标识的节点
    7. // 该容器是专人专用的,所以不同的元素使用都要在constructor调用
    8. this.myRef = React.createRef()
    9. this.myRef1 = React.createRef()
    10. }
    11. showData() {
    12. alert(this.myRef.current.value)
    13. }
    14. showData1() {
    15. alert(this.myRef1.current.value)
    16. }
    17. render() {
    18. return (
    19. <div>
    20. <input ref={this.myRef} type="text" placeholder='点击按钮提示数据' />
    21. <button onClick={() => this.showData()}>点击打印数据button>
    22. <input ref={this.myRef1} type="text" placeholder='点击按钮提示数据' />
    23. <button onClick={() => this.showData1()}>点击打印数据button>
    24. div>
    25. )
    26. }
    27. }

    6.表单之非受控组件和受控组件

    1. import React, { Component } from 'react'
    2. export default class ClassHanshu extends Component {
    3. constructor() {
    4. super()
    5. }
    6. // 非受控组件
    7. handleSubmit = (event) => {
    8. // 阻止默认事件
    9. event.preventDefault();
    10. // 现用现取为非受控组件
    11. const { username, password } = this
    12. alert(`username的值是:${username.value},password的值是:${password.value}`)
    13. }
    14. render() {
    15. return (
    16. <div>
    17. <form onSubmit={this.handleSubmit}>
    18. 用户名: <input type="text" name="username" ref={c => this.username = c} />
    19. 密码: <input type="password" name="password" ref={c => this.password = c} />
    20. <button>登录button>
    21. form>
    22. div>
    23. )
    24. }
    25. }
    1. import React, { Component } from 'react'
    2. export default class ClassHanshu extends Component {
    3. constructor() {
    4. super()
    5. this.state = {
    6. username: "",
    7. password: ""
    8. }
    9. }
    10. // 受控组件,输入框输入的值可以实时获取到,建议使用受控组件可以省略掉ref(官网建议请勿过度使用ref)
    11. // 表单提交的回调
    12. handleSubmit = (event) => {
    13. // 阻止默认事件
    14. event.preventDefault();
    15. const { username, password } = this.state
    16. console.log(`username的值是:${username},password的值是:${password}`)
    17. }
    18. saveUsername = (event) => {
    19. this.setState({
    20. username: event.target.value
    21. })
    22. }
    23. savePassword = (event) => {
    24. this.setState({
    25. password: event.target.value
    26. })
    27. }
    28. render() {
    29. return (
    30. <div>
    31. <form onSubmit={this.handleSubmit}>
    32. 用户名: <input type="text" name="username" onChange={this.saveUsername} />
    33. 密码: <input type="password" name="password" onChange={this.savePassword} />
    34. <button>登录button>
    35. form>
    36. div>
    37. )
    38. }
    39. }

    7.高阶函数和函数柯里化,解决受控组件代码冗余问题

    1. import React, { Component } from 'react'
    2. export default class ClassHanshu extends Component {
    3. constructor() {
    4. super()
    5. this.state = {
    6. username: "",
    7. password: ""
    8. }
    9. }
    10. handleSubmit = (event) => {
    11. // 阻止默认事件
    12. event.preventDefault();
    13. const { username, password } = this.state
    14. console.log(`username的值是:${username},password的值是:${password}`)
    15. }
    16. // 通过高阶函数解决受控组件代码冗余的问题
    17. // 高阶组件 1.若A函数,接受的参数是一个函数,那么A就可以称为高阶函数
    18. // 2.若A函数,调用的返回值依然是一个函数,那么A就可以称为高阶函数
    19. // 常见高阶函数:promise setTimeout arr.map()等
    20. // 函数柯里化:通过函数调用回继续返函数的方式,实现多次接收参数最后统一处理的函数编码形式
    21. // 以下的saveForm就是高阶函数,里面返回的是箭头函数(柯里化)
    22. saveForm = (dataType) => {
    23. return (event) => {
    24. this.setState({
    25. [dataType]: event.target.value
    26. })
    27. }
    28. }
    29. render() {
    30. return (
    31. <div>
    32. <form onSubmit={this.handleSubmit}>
    33. 用户名: <input type="text" name="username" onChange={this.saveForm("username")} />
    34. 密码: <input type="password" name="password" onChange={this.saveForm("password")} />
    35. <button>登录button>
    36. form>
    37. div>
    38. )
    39. }
    40. }

  • 相关阅读:
    vue 02 Vue模板语法
    【STM32开发笔记】搭建VSCode+PyOCD的STM32开发环境
    【仿牛客论坛java项目】第五章 Kafka,构建TB级异步消息系统:阻塞队列、Kafka入门、Spring整合Kafka、发送系统通知、显示系统通知
    Azure DevOps (三) 实现和Jenkins的联动
    【Linux从入门到精通】通信 | 共享内存(System V)
    淘宝商品详情API接口(标题|主图|SKU|价格|商品销量)
    「Redis数据结构」RedisObject
    C# 如何将使用的Dll嵌入到.exe应用程序中?
    layui table表格跨页多选
    测试管理 | 龙智获得Xray专家认证
  • 原文地址:https://blog.csdn.net/qq_72760247/article/details/128004949