[尚硅谷React笔记]——第2章 React面向组件编程

news2024/11/29 20:58:08

 目录:

  1. 基本理解和使用:
    1. 使用React开发者工具调试
    2. 函数式组件
    3. 复习类的基本知识
    4. 类式组件
  2. 组件三大核心属性1: state
    1. 复习类中方法this指向: 
    2. 复习bind函数:
    3. 解决changeWeather中this指向问题:
    4. 一般写法:state.html
    5. 在精简写法之前,复习一下类的基本知识:
    6. 精简写法:
  3. 组件三大核心属性2: props
    1. props的基本使用.html
    2. 复习展开运算符.html
    3. 使用展开运算符,批量传递props
    4. 对props进行限制
    5. props的简写方式.html
    6. 类式组件中的构造器与props:
    7. 函数式组件使用props:
  4. 组件三大核心属性3: refs与事件处理
    1. 字符串形式的ref
    2. 回调形式的ref
    3. 回调ref中调用次数的问题
    4. createRef的使用
    5. 事件处理
  5. 收集表单数据
    1. 非受控组件
    2. 受控组件
  6. 高阶函数,函数柯里化
    1. ​​​​​​​高阶函数,函数柯里化
    2. 对象相关的知识
    3. 演示函数的柯里化
  7. 组件的生命周期
    1. ​​​​​​​​​​​​​​引出生命周期
    2. react生命周期(旧) 
    3. react生命周期(l日)_setState流程
    4. react生命周期(l日)_forceUpdate流程
  8. 虚拟DOM与DOM Diffing算法

1.基本理解和使用:

使用React开发者工具调试

函数式组件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--准备好一个“容器”-->
<div id="test"></div>

<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>

<script type="text/babel">
    function MyComponent() {
        console.log(this)//此处的this是undefined,因为babel编译后开启了严格模式
        return <h2>我是用函数定义的组件(适用于【简单组件】的定义)</h2>
    }

    ReactDOM.render(<MyComponent></MyComponent>, document.getElementById('test'))

    // 执行了ReactDOM.render(<MyComponent/>.......之后,发生了什么?
    //    1.React解析组件标签,找到了MyComponent组件。
    //    ⒉发现组件是使用函数定义的,随后调用该函数,将返回的虚拟DON转为真实DOM,随后呈现在页面中。
</script>
</body>
</html>

运行结果:

复习类的基本知识:

总结:

  1. 类中的构造器不是必须写的,要对实例进行一些初始化的操作,如添加指定属性时厅与。
  2. 如果A类继承了B类,且A类中写了构造器,那么A类构造器中的super是必须要调用的。
  3. 类中所定义的方法,都是放在了类的原型对象上,供实例去使用

代码示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script type="text/javascript">
    // 创建一个Person类
    class Person {
        //构造器方法
        constructor(name, age) {
            //构造器中的this是谁?—类的实例对象
            this.name = name
            this.age = age
            this.school = '尚硅谷'
        }

        //一般方法
        speak() {
            //speak方法放在了哪里?—类的原型对象上,供实例使用
            //通过Person实例调用speak时,speak中的this就是Person实例
            console.log(`我叫${this.name},我年龄是${this.age}`)
        }
    }

    //创建一个Student类,继承于Person类
    class Student extends Person {
        constructor(name, age, grade) {
            super(name, age);
            this.grade = grade
        }

        //重写从父类继承过来的方法
        speak() {
            console.log(`我叫${this.name},我年龄是${this.age},我读的是${this.grade}年级`)
        }

        study() {
            //study方法放在了哪里?—类的原型对象上,供实例使用
            //通过student实例调用study时,study中的this就是Student实例
            console.log('我很努力的学习')
        }
    }

    const s1 = new Student('小张', 15, '高一')
    console.log(s1)
    s1.speak()
    s1.study()
</script>
</body>
</html>

类式组件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--准备好一个“容器”-->
<div id="test"></div>

<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>

<script type="text/babel">
    //1.创建类式组件
    class MyComponent extends React.Component {
        render() {
            //render是放在哪里的?-—- MyComponent的原型对象上,供实例使用。
            //render中的this是谁?— MyComponent的实例对象。MyComponent组件实例对象
            return <h2>我是类定义的组件(适用于【复杂组件】的定义)</h2>
        }
    }

    //2.渲染组件到页面
    ReactDOM.render(<MyComponent/>, document.getElementById('test'))
    /**
     * 执行了ReactDOM.render(<MyComponent/>.......之后,发生了什么?
     * 1.React解析组件标签,找到了MyComponent组件。
     * 2.发现组件是使用类定义的,随后new出来该类的实例,并通过该实例调用到原型上的render方法。
     * 3.将render返回的虚拟DOM转为真实DOM,随后呈现在页面中。
     * */
</script>
</body>
</html>

运行结果:

2.组件三大核心属性1: state

简介:

在React中,state是一个非常重要的属性,主要用于标识组件的状态,以及更新UI,使页面动态变化。

对于state的定义和使用,主要有以下特点:

  1. state的值是json对象类型,可以维护多个key-value的组合。
  2. 在类组件中,state是组件的一个默认属性,用于存储和跟踪组件的状态。当state变化时,组件将被重新渲染。这意味着React将根据最新的state值重新计算渲染输出,并对DOM进行更新。
  3. 在函数组件中,由于没有对象属性(babel默认开启了局部严格模式,函数内部this指向undefined),所以没有state属性。因此,函数组件只负责展示静态页面,而不进行动态更新。
  4. state的值是可变的,但props的值是只读的。props属性值可以进行类型、必要性限制,也可以设置属性默认值,但组件自身不能修改props属性值。

总的来说,React的state主要用于存储和更新组件的状态,从而可以动态地控制组件的渲染和显示内容。

复习原生事件绑定:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<button id="btn1">按钮1</button>
<button id="btn2">按钮2</button>
<button onclick="demo()">按钮3</button>

<script type="text/javascript">
    const btn1 = document.getElementById('btn1')
    btn1.addEventListener('click', () => {
        alert('按钮1被点击了')
    })

    const btn2 = document.getElementById('btn2')
    btn2.onclick = () => {
        alert('按钮2被点击了')
    }

    function demo() {
        alert('按钮3被点击了')
    }


</script>
</body>
</html>

复习类中方法this指向: 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script type="text/javascript">
    class Person {
        constructor(name, age) {
            this.name = name
            this.age = age
        }

        study() {
            //study方法放在了哪里?—类的原型对象上,供实例使用
            //通过Person实例调用study时,study中的this就是Person实例
            console.log(this)
        }
    }

    const p1 = new Person('tom', 18)
    p1.study()
    const x = p1.study
    x()


    //为了证明js自动在类中的方法上加了严格模式,this不指向window
    function demo() {
        console.log(this)
    }

    demo()

    function demo1() {
        'use strict'
        console.log(this)
    }

    demo1()


</script>
</body>
</html>

复习bind函数:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script type="text/javascript">
    function demo() {
        console.log(this)
    }

    demo()

    const x = demo.bind({a: 1, b: 2})
    x()
</script>
</body>
</html>

效果(需求: 定义一个展示天气信息的组件

  1. 默认展示天气炎热 凉爽
  2. 点击文字切换天气

 解决changeWeather中this指向问题:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--准备好一个“容器”-->
<div id="test"></div>

<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>

<script type="text/babel">
    //1.创建组件
    class Weather extends React.Component {
        constructor(props) {
            super(props);
            //初始化状态
            this.state = {isHot: true}
            //解决changeweather中this指向问题
            this.changeWeather = this.changeWeather.bind(this)
        }

        render() {
            const {isHot} = this.state
            return <h1 onClick={this.changeWeather}>今天天气很{isHot ? '炎热' : '凉爽'}</h1>
        }

        changeWeather() {
            //changeweather放在哪里?—— weather的原型对象上,供实例使用
            //由于changeweather是作为onClick的回调,所以不是通过实例调用的,是直接调用
            //类中的方法默认开启了局部的严格模式,所以changeweather中的this为undefined
            console.log(this)
        }
    }

    //2.渲染组件到页面
    ReactDOM.render(<Weather/>, document.getElementById('test'))
</script>
</body>
</html>

 一般写法:state.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--准备好一个“容器”-->
<div id="test"></div>

<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>

<script type="text/babel">
    //1.创建组件
    class Weather extends React.Component {
        //构造器调用几次?  --  1次
        constructor(props) {
            console.log('constructor')
            super(props);
            //初始化状态
            this.state = {isHot: true, wind: '微风'}
            //解决changeweather中this指向问题
            this.changeWeather = this.changeWeather.bind(this)
        }

        //render调用几次?  --  1+n次 1是初始化的那次 n是状态更新的次数
        render() {
            console.log('render')
            const {isHot, wind} = this.state
            return <h1 onClick={this.changeWeather}>今天天气很{isHot ? '炎热' : '凉爽'},{wind}</h1>
        }

        //changeWeather调用几次?  --  点几次调几次
        changeWeather() {
            //changeweather放在哪里?—— weather的原型对象上,供实例使用
            //由于changeweather是作为onClick的回调,所以不是通过实例调用的,是直接调用
            //类中的方法默认开启了局部的严格模式,所以changeweather中的this为undefined
            // console.log(this)

            console.log('changeWeather')

            const isHot = this.state.isHot

            //严重注意:状态(state)不可直接更改,下面这行就是直接更改!! !
            // this.state.isHot = !isHot
            // console.log(this.state.isHot)

            // /严重注意:状态必须通过setState进行更新,且更新是一种合并,不是替换。
            this.setState({isHot: !isHot})
        }
    }

    //2.渲染组件到页面
    ReactDOM.render(<Weather/>, document.getElementById('test'))
</script>
</body>
</html>

在精简写法之前,复习一下类的基本知识:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script type="text/javascript">
    // 创建一个Person类
    class Person {
        //构造器方法
        constructor(name, age) {
            //构造器中的this是谁?—类的实例对象
            this.name = name
            this.age = age
            this.school = '尚硅谷'
        }

        //一般方法
        speak() {
            //speak方法放在了哪里?—类的原型对象上,供实例使用
            //通过Person实例调用speak时,speak中的this就是Person实例
            console.log(`我叫${this.name},我年龄是${this.age}`)
        }
    }

    //创建一个Student类,继承于Person类
    class Student extends Person {
        constructor(name, age, grade) {
            super(name, age);
            this.grade = grade
        }

        //重写从父类继承过来的方法
        speak() {
            console.log(`我叫${this.name},我年龄是${this.age},我读的是${this.grade}年级`)
        }

        study() {
            //study方法放在了哪里?—类的原型对象上,供实例使用
            //通过student实例调用study时,study中的this就是Student实例
            console.log('我很努力的学习')
        }
    }

    //
    // const s1 = new Student('小张', 15, '高一')
    // console.log(s1)
    // s1.speak()
    // s1.study()

    class Car {
        constructor(name, price) {
            this.name = name
            this.price = price
        }

        a = 1
    }

    const c1 = new Car('奔驰c63', 199)
    const c2 = new Car('宝马', 299)
    console.log(c1)
    console.log(c2)
</script>
</body>
</html>

精简写法: 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--准备好一个“容器”-->
<div id="test"></div>

<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>

<script type="text/babel">
    //1.创建组件
    class Weather extends React.Component {
        state = {isHot: true, wind: '微风'}

        render() {
            const {isHot, wind} = this.state
            return <h1 onClick={this.changeWeather}>今天天气很{isHot ? '炎热' : '凉爽'},{wind}</h1>
        }

        changeWeather = () => {
            const isHot = this.state.isHot
            this.setState({isHot: !isHot})
        }
    }

    //2.渲染组件到页面
    ReactDOM.render(<Weather/>, document.getElementById('test'))
</script>
</body>
</html>

理解

  1. state是组件对象最重要的属性, 值是对象(可以包含多个key-value的组合)
  2. 组件被称为"状态机", 通过更新组件的state来更新对应的页面显示(重新渲染组件)

强烈注意

  1. 组件中render方法中的this为组件实例对象
  2. 组件自定义的方法中this为undefined,如何解决?
    1. 强制绑定this: 通过函数对象的bind()
    2. 箭头函数
  3. 状态数据,不能直接修改或更新

3.组件三大核心属性2: props

简介:

React中的props是一种类似于JavaScript函数的组件概念,它允许组件接收任意的输入参数,并返回用于描述页面展示内容的React元素。

具体来说,props的主要作用和用途包括以下几个方面:

  1. 传递数据:props可以用于向子组件传递数据,这些数据可能是父组件的状态或者是其他兄弟组件的状态。通过props,子组件可以获得父组件或其他组件传递过来的数据,从而更新自己的状态。
  2. 外部控制:通过props,父组件可以对子组件进行控制,例如设置初始状态或者传递回调函数。这种控制方式使得React的组件之间具有更好的互动性和协作性。
  3. 自定义行为:通过props,我们可以向组件传递一些自定义的属性,从而改变组件的行为或者样式。例如,我们可以向按钮组件传递一个“disabled”属性,使得按钮变得不可点击。
  4. 属性约束:与state不同,props是只读的,也就是说子组件不能修改父组件传递过来的props数据。这使得React的组件之间具有更好的可维护性和可预测性。

总的来说,React的props是一种强大的工具,它可以使得组件之间的数据传递更加灵活和高效,同时也可以使得组件的行为更加自定义和可控。

props的基本使用.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--准备好一个“容器”-->
<div id="test1"></div>
<div id="test2"></div>
<div id="test3"></div>

<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>

<script type="text/babel">
    //创建组件
    class Person extends React.Component {
        render() {
            console.log(this)
            const {name, age, sex} = this.props
            return (
                // <ul>
                //     <li>姓名:{this.props.name}</li>
                //     <li>性别:{this.props.sex}</li>
                //     <li>年龄:{this.props.age}</li>
                // </ul>
                <ul>
                    <li>姓名:{name}</li>
                    <li>性别:{sex}</li>
                    <li>年龄:{age}</li>
                </ul>
            )
        }
    }

    //2.渲染组件到页面
    ReactDOM.render(<Person name="jerry" age="19" sex="男"></Person>, document.getElementById('test1'))
    ReactDOM.render(<Person name="kitty" age="20" sex="女"></Person>, document.getElementById('test2'))
    ReactDOM.render(<Person name="wang" age="19" sex="男"></Person>, document.getElementById('test3'))
</script>
</body>
</html>

复习展开运算符.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script type="text/javascript">
    let arr1 = [1, 3, 5, 7, 9]
    let arr2 = [2, 4, 6, 8, 10]
    console.log(...arr1)
    let arr3 = [...arr1, ...arr2]
    console.log(arr3)

    // function sum(a, b) {
    //     return a + b
    // }
    //
    // console.log(sum(1, 2))

    // function sum(...numbers) {
    //     console.log('@', numbers)
    // }
    //
    // console.log(sum(1, 2, 3, 4))

    function sum(...numbers) {
        return numbers.reduce((preValue, currentValue) => {
            return preValue + currentValue
        })
    }

    console.log(sum(1, 2, 3, 4))

    //构造字面量对象时使用展开语法
    let person = {name: 'tom', age: 18}
    let person2 = {...person}
    // console.log(...person) //报错,展开运算符不能展开对象
    console.log({...person})  //不报错,多加了一个{}

    person.name = 'jerry'
    console.log(person2.name)
    console.log(person)

    //合并
    let person3 = {...person, name: 'jack', address: '地球'}
    console.log(person3)
</script>
</body>
</html>

使用展开运算符,批量传递props

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--准备好一个“容器”-->
<div id="test1"></div>
<div id="test2"></div>
<div id="test3"></div>

<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>

<script type="text/babel">
    //创建组件
    class Person extends React.Component {
        render() {
            console.log(this)
            const {name, age, sex} = this.props
            return (
                // <ul>
                //     <li>姓名:{this.props.name}</li>
                //     <li>性别:{this.props.sex}</li>
                //     <li>年龄:{this.props.age}</li>
                // </ul>
                <ul>
                    <li>姓名:{name}</li>
                    <li>性别:{sex}</li>
                    <li>年龄:{age}</li>
                </ul>
            )
        }
    }

    //2.渲染组件到页面
    ReactDOM.render(<Person name="jerry" age="19" sex="男"></Person>, document.getElementById('test1'))
    ReactDOM.render(<Person name="kitty" age="20" sex="女"></Person>, document.getElementById('test2'))

    const p = {name: '老刘', age: 18, sex: '女'}
    console.log(...p, '@');
    console.log({...p}, '@');
    // ReactDOM.render(<Person name="wang" age="19" sex="男"></Person>, document.getElementById('test3'))
    ReactDOM.render(<Person {...p}></Person>, document.getElementById('test3'))
</script>
</body>
</html>

对props进行限制

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--准备好一个“容器”-->
<div id="test1"></div>
<div id="test2"></div>
<div id="test3"></div>

<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>

<script type="text/javascript" src="../js/prop-types.js"></script>

<script type="text/babel">
    //创建组件
    class Person extends React.Component {
        render() {
            console.log(this)
            const {name, age, sex} = this.props
            return (
                <ul>
                    <li>姓名:{name}</li>
                    <li>性别:{sex}</li>
                    <li>年龄:{age + 1}</li>
                </ul>
            )
        }
    }

    //对标签属性进行类型、必要性的限制
    Person.propTypes = {
        name: PropTypes.string.isRequired,
        sex: PropTypes.string,
        age: PropTypes.number,
        speak: PropTypes.func
    }
    //指定默认标签属性值
    Person.defaultProps = {
        sex: '男',
        age: 18
    }

    //2.渲染组件到页面
    ReactDOM.render(<Person name="jerry" age={19} speak={speak}></Person>, document.getElementById('test1'))
    ReactDOM.render(<Person name="kitty" age={18} sex="女"></Person>, document.getElementById('test2'))

    const p = {name: '老刘', age: 18, sex: '女'}

    ReactDOM.render(<Person {...p}></Person>, document.getElementById('test3'))

    function speak() {
        console.log('我说话了')
    }
</script>
</body>
</html>

props的简写方式.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--准备好一个“容器”-->
<div id="test1"></div>
<div id="test2"></div>
<div id="test3"></div>

<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>

<script type="text/javascript" src="../js/prop-types.js"></script>

<script type="text/babel">
    //创建组件
    class Person extends React.Component {
        //对标签属性进行类型,必要性的限制
        static propTypes = {
            name: PropTypes.string.isRequired,
            sex: PropTypes.string,
            age: PropTypes.number,
            speak: PropTypes.func
        }

        //指定默认标签属性值
        static defaultProps = {
            sex: '男',
            age: 18
        }

        render() {
            console.log(this)
            const {name, age, sex} = this.props
            return (
                <ul>
                    <li>姓名:{name}</li>
                    <li>性别:{sex}</li>
                    <li>年龄:{age + 1}</li>
                </ul>
            )
        }
    }

    //2.渲染组件到页面
    ReactDOM.render(<Person name="jerry" age={19} speak={speak}></Person>, document.getElementById('test1'))
    ReactDOM.render(<Person name="kitty" age={18} sex="女"></Person>, document.getElementById('test2'))

    const p = {name: '老刘', age: 18, sex: '女'}

    ReactDOM.render(<Person {...p}></Person>, document.getElementById('test3'))

    function speak() {
        console.log('我说话了')
    }
</script>
</body>
</html>

类式组件中的构造器与props:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--准备好一个“容器”-->
<div id="test1"></div>

<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>

<script type="text/javascript" src="../js/prop-types.js"></script>

<script type="text/babel">
    //创建组件
    class Person extends React.Component {
        //构造器是否接受props,是否传递给super,取决于:是否希望在构造器中通过this访间props
        constructor(props) {
            console.log(props)
            super(props)
            console.log('constructor', this.props)
        }

        //对标签属性进行类型,必要性的限制
        static propTypes = {
            name: PropTypes.string.isRequired,
            sex: PropTypes.string,
            age: PropTypes.number,
            speak: PropTypes.func
        }

        //指定默认标签属性值
        static defaultProps = {
            sex: '男',
            age: 18
        }

        render() {
            const {name, age, sex} = this.props
            return (
                <ul>
                    <li>姓名:{name}</li>
                    <li>性别:{sex}</li>
                    <li>年龄:{age + 1}</li>
                </ul>
            )
        }
    }

    //2.渲染组件到页面
    ReactDOM.render(<Person name="jerry"></Person>, document.getElementById('test1'))
</script>
</body>
</html>

函数式组件使用props:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--准备好一个“容器”-->
<div id="test1"></div>

<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>

<script type="text/javascript" src="../js/prop-types.js"></script>

<script type="text/babel">
    function Person(props) {
        const {name, age, sex} = props
        return (
            <ul>
                <li>姓名:{name}</li>
                <li>性别:{age}</li>
                <li>年龄:{sex}</li>
            </ul>
        )
    }

    //对标签属性进行类型,必要性的限制
    Person.propTypes = {
        name: PropTypes.string.isRequired,
        sex: PropTypes.string,
        age: PropTypes.number,
        speak: PropTypes.func
    }

    //指定默认标签属性值
    Person.defaultProps = {
        sex: '男',
        age: 18
    }

    //2.渲染组件到页面
    ReactDOM.render(<Person name="jerry"></Person>, document.getElementById('test1'))
</script>
</body>
</html>

4.组件三大核心属性3: refs与事件处理

简介:

  • React中的refs属性是一种提供对真实DOM(组件)的引用的机制,通过这个引用,我们可以直接操作DOM(组件)。
  • 在React中,我们通常不会直接操作底层的DOM元素,而是通过在render方法中编写页面结构,并由React来组织DOM元素的更新。然而,有些情况下,我们可能需要对页面的真实DOM进行直接操作,这时就需要用到refs。
  • refs是用于访问和操作React元素(虚拟DOM元素)的一种方式。它使我们能够更加方便且准确地控制refs的设置和解除。在ref中,我们可以传递一个函数,这个函数接受React组件实例或HTML DOM元素作为参数,以使它们能在其他地方被存储和访问。
  • 对于事件处理,React中的refs也提供了相应的机制。例如,我们可以使用refs来获取HTML元素并注册事件处理函数,以便在用户与页面交互时执行特定的操作。
  • 总的来说,React的refs属性为我们提供了一种机制,使我们能够对React元素(虚拟DOM元素)进行直接操作,以及处理用户与页面交互的事件。

字符串形式的ref:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--准备好一个“容器”-->
<div id="test"></div>

<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>

<script type="text/javascript" src="../js/prop-types.js"></script>

<script type="text/babel">
    //创建组件
    class Demo extends React.Component {
        showData = () => {
            const {input1} = this.refs
            alert(input1.value)
        }
        showData2 = () => {
            const {input2} = this.refs
            alert(input2.value)
        }

        render() {
            return (
                <div>
                    <input ref="input1" type="text" placeholder="点击按钮提示数据"></input>
                    <button onClick={this.showData}>点我提示左侧的数据</button>
                    <input ref="input2" onBlur={this.showData2} type="text" placeholder="失去焦点提示数据"></input>
                </div>
            )
        }
    }

    //2.渲染组件到页面
    ReactDOM.render(<Demo a="1" b="2"></Demo>, document.getElementById('test'))
</script>
</body>
</html>

回调形式的ref:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--准备好一个“容器”-->
<div id="test"></div>

<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>

<script type="text/javascript" src="../js/prop-types.js"></script>

<script type="text/babel">
    //创建组件
    class Demo extends React.Component {
        showData = () => {
            const {input1} = this
            alert(input1.value)
        }
        showData2 = () => {
            const {input2} = this
            alert(input2.value)
        }

        render() {
            return (
                <div>
                    <input ref={(currentNode) => {this.input1 = currentNode}} type="text" placeholder="点击按钮提示数据"></input>
                    <button onClick={this.showData}>点我提示左侧的数据</button>
                    <input ref={(currentNode) => {this.input2 = currentNode}} onBlur={this.showData2} type="text" placeholder="失去焦点提示数据"></input>
                </div>
            )
        }
    }

    //2.渲染组件到页面
    ReactDOM.render(<Demo a="1" b="2"></Demo>, document.getElementById('test'))
</script>
</body>
</html>

回调ref中调用次数的问题:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--准备好一个“容器”-->
<div id="test"></div>

<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>

<script type="text/javascript" src="../js/prop-types.js"></script>

<script type="text/babel">
    //创建组件
    class Demo extends React.Component {
        state = {isHot: true}

        showInfo = () => {
            const {input1} = this
            alert(input1.value)
        }

        changeWeather = () => {
            const {isHot} = this.state
            this.setState({isHot: !isHot})
        }

        saveInput = (currentNode) => {
            this.input1 = currentNode;
            console.log('@', currentNode);
        }

        render() {
            const {isHot} = this.state
            return (
                <div>
                    <h2>今天天气很{isHot ? '炎热' : '凉爽'}</h2>
                    <br></br>

                    {/*<input ref={(currentNode) => {this.input1 = currentNode;console.log('@', currentNode);}} type="text"></input>*/}
                    <input ref={this.saveInput} type="text"></input>
                    <br></br>

                    <button onClick={this.showInfo}>点我提示输入的数据</button>
                    <button onClick={this.changeWeather}>点我切换天气</button>
                    <br></br>
                </div>
            )
        }
    }

    //2.渲染组件到页面
    ReactDOM.render(<Demo></Demo>, document.getElementById('test'))
</script>
</body>
</html>

createRef的使用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--准备好一个“容器”-->
<div id="test"></div>

<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>

<script type="text/javascript" src="../js/prop-types.js"></script>

<script type="text/babel">
    //创建组件
    class Demo extends React.Component {
        // React.createRef调用后可以返回一个容器,该容器可以存储被ref所标识的节点,该容器是“专人专用”的
        myRef = React.createRef()
        myRef2 = React.createRef()

        showData = () => {
            alert(this.myRef.current.value)
        }
        showData2 = () => {
            alert(this.myRef2.current.value)
        }

        render() {
            return (
                <div>
                    <input ref={this.myRef} type="text" placeholder="点击按钮提示数据"></input>
                    <button onClick={this.showData}>点我提示左侧的数据</button>
                    <input ref={this.myRef2} onBlur={this.showData2} type="text" placeholder="失去焦点提示数据"></input>
                </div>
            )
        }
    }

    //2.渲染组件到页面
    ReactDOM.render(<Demo a="1" b="2"></Demo>, document.getElementById('test'))
</script>
</body>
</html>

 事件处理

  • 1.通过onXxx属性指定事件处理函数(注意大小写)
    • a.React使用的是自定义(合成)事件,而不是使用的原生DOM事件 ----- 为了更好的兼容性
    • b.React中的事件是通过事件委托方式处理的(委托给组件最外层的元素) ----- 为了高效
  • 2.通过event.target得到发生事件的DOM元素对象-不要过度使用ref
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--准备好一个“容器”-->
<div id="test"></div>

<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>

<script type="text/javascript" src="../js/prop-types.js"></script>

<script type="text/babel">
    //创建组件
    class Demo extends React.Component {
        // React.createRef调用后可以返回一个容器,该容器可以存储被ref所标识的节点,该容器是“专人专用”的
        myRef = React.createRef()
        myRef2 = React.createRef()

        showData = (event) => {
            console.log(event, 'showData event')
            console.log(event.target.value)
            console.log(this.myRef.current.value)
            alert(this.myRef.current.value)
        }
        showData2 = (event) => {
            console.log(event, 'showData2 event')
            alert(event.target.value)
        }

        render() {
            return (
                <div>
                    <input ref={this.myRef} type="text" placeholder="点击按钮提示数据"></input>
                    <button onClick={this.showData}>点我提示左侧的数据</button>
                    <input onBlur={this.showData2} type="text" placeholder="失去焦点提示数据"></input>
                </div>
            )
        }
    }

    //2.渲染组件到页面
    ReactDOM.render(<Demo a="1" b="2"></Demo>, document.getElementById('test'))
</script>
</body>
</html>

5.收集表单数据

非受控组件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--准备好一个“容器”-->
<div id="test"></div>

<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>

<script type="text/javascript" src="../js/prop-types.js"></script>

<script type="text/babel">
    //创建组件
    class Login extends React.Component {
        handleSubmit = (event) => {
            event.preventDefault()
            const {username, password} = this
            alert(`你输入的用户名是:${username.value},你输入的密码是:${password.value}`)
        }

        render() {
            return (
                <form action="http://www.atguigu.com" onSubmit={this.handleSubmit}>
                    用户名:<input ref={c => this.username = c} type="text" name="username"></input>
                    密码:<input ref={c => this.password = c} type="password" name="password"></input>
                    <button>登录</button>
                </form>
            )
        }
    }

    //2.渲染组件到页面
    ReactDOM.render(<Login></Login>, document.getElementById('test'))
</script>
</body>
</html>

受控组件 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--准备好一个“容器”-->
<div id="test"></div>

<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>

<script type="text/javascript" src="../js/prop-types.js"></script>

<script type="text/babel">
    //创建组件
    class Login extends React.Component {
        state = {
            username: '',
            password: ''
        }

        saveUsername = (event) => {
            this.setState({username: event.target.value})
        }

        savePassword = (event) => {
            this.setState({password: event.target.value})
        }

        handleSubmit = (event) => {
            event.preventDefault()
            const {username, password} = this.state
            alert(`你输入的用户名是:${username},你输入的密码是:${password}`)
        }

        render() {
            return (
                <form action="http://www.atguigu.com" onSubmit={this.handleSubmit}>
                    用户名:<input onChange={this.saveUsername} type="text" name="username"></input>
                    密码:<input onChange={this.savePassword} type="password" name="password"></input>
                    <button>登录</button>
                </form>
            )
        }
    }

    //2.渲染组件到页面
    ReactDOM.render(<Login></Login>, document.getElementById('test'))
</script>
</body>
</html>

6.高阶函数,函数柯里化

高阶函数:如果一个函数符合下面2个规范中的任何一个,那该函数就是高阶函数。

  1. 若A函数,接收的参数是一个函数,那么A就可以称之为高阶函数。
  2. 若A函数,调用的返回值依然是一个函数,那么A就可以称之为高阶函数。
  3. 常见的高阶函数有:Promise、setTimeout、arr.map()等等

函数的柯里化:通过函数调用继续返回函数的方式,实现多次接收参数最后统一处理的函数编码形式。

高阶函数,函数柯里化

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--准备好一个“容器”-->
<div id="test"></div>

<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>

<script type="text/javascript" src="../js/prop-types.js"></script>

<script type="text/babel">
    //创建组件
    class Login extends React.Component {
        state = {
            username: '',
            password: ''
        }

        saveFormData = (dateType) => {
            return (event) => {
                this.setState({[dateType]: event.target.value})
            }
        }

        handleSubmit = (event) => {
            event.preventDefault()
            const {username, password} = this.state
            alert(`你输入的用户名是:${username},你输入的密码是:${password}`)
        }

        render() {
            return (
                <form action="http://www.atguigu.com" onSubmit={this.handleSubmit}>
                    用户名:<input onChange={this.saveFormData('username')} type="text" name="username"></input>
                    密码:<input onChange={this.saveFormData('password')} type="password" name="password"></input>
                    <button>登录</button>
                </form>
            )
        }
    }

    //2.渲染组件到页面
    ReactDOM.render(<Login></Login>, document.getElementById('test'))
</script>
</body>
</html>

对象相关的知识

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script type="text/javascript">
    let a = 'name'

    let obj = {}
    obj[a] = 'tom'
    console.log(obj)
</script>
</body>
</html>

演示函数的柯里化

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script type="text/javascript">
    // function sum(a, b, c) {
    //     return a + b + c
    // }
    //
    // const result = sum(1, 2, 3)
    // console.log(result)

    function sum(a) {
        return (b) => {
            return (c) => {
                return a + b + c
            }
        }
    }

    const result = sum(1)(2)(3)
    console.log(result)
</script>
</body>
</html>

7.组件的生命周期

引出生命周期:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--准备好一个“容器”-->
<div id="test"></div>

<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>

<script type="text/javascript" src="../js/prop-types.js"></script>

<script type="text/babel">
    //创建组件
    class Life extends React.Component {
        state = {opacity: 1}

        death = () => {
            clearInterval(this.timer)
            ReactDOM.unmountComponentAtNode(document.getElementById('test'))
        }

        //组件挂载完毕
        componentDidMount() {
            console.log('组件挂载完毕')
            this.timer = setInterval(() => {
                let {opacity} = this.state
                opacity -= 0.1
                if (opacity <= 0) opacity = 1
                this.setState({opacity})
            }, 200)
        }

        //组件将要卸载
        componentWillUnmount() {
            console.log('组件将要卸载')
            clearInterval(this.timer)
        }

        //初始化渲染、状态更新之后
        render() {
            console.log('render')
            return (
                <div>
                    <h2 style={{opacity: this.state.opacity}}>React学不会怎么办?</h2>
                    <button onClick={this.death}>不活了</button>
                </div>
            )
        }
    }

    //2.渲染组件到页面
    ReactDOM.render(<Life></Life>, document.getElementById('test'))
</script>
</body>
</html>

react生命周期(旧) 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--准备好一个“容器”-->
<div id="test"></div>

<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>

<script type="text/javascript" src="../js/prop-types.js"></script>

<script type="text/babel">
    //创建组件
    class Count extends React.Component {
        constructor(props) {
            console.log('Count---constructor')
            super(props);
            this.state = {count: 0}
        }

        state = {count: 0}

        add = () => {
            const {count} = this.state
            this.setState({count: count + 1})
        }

        death = () => {
            ReactDOM.unmountComponentAtNode(document.getElementById('test'))
        }

        componentWillMount() {
            console.log('Count---componentWillMount')
        }

        componentDidMount() {
            console.log('Count---componentDidMount')
        }

        componentWillUnmount() {
            console.log('Count---componentWillUnmount')
        }

        render() {
            console.log('Count---render')
            const {count} = this.state
            return (
                <div>
                    <h2>当前求和为:{count}</h2>
                    <button onClick={this.add}>点我+1</button>
                    <button onClick={this.death}>卸载组件</button>
                </div>
            )
        }
    }

    //2.渲染组件到页面
    ReactDOM.render(<Count></Count>, document.getElementById('test'))
</script>
</body>
</html>

 react生命周期(l日)_setState流程

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--准备好一个“容器”-->
<div id="test"></div>

<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>

<script type="text/javascript" src="../js/prop-types.js"></script>

<script type="text/babel">
    //创建组件
    class Count extends React.Component {
        constructor(props) {
            console.log('Count---constructor')
            super(props);
            this.state = {count: 0}
        }

        state = {count: 0}

        add = () => {
            const {count} = this.state
            this.setState({count: count + 1})
        }

        death = () => {
            ReactDOM.unmountComponentAtNode(document.getElementById('test'))
        }

        componentWillMount() {
            console.log('Count---componentWillMount')
        }

        // 组件挂载完毕的钩子
        componentDidMount() {
            console.log('Count---componentDidMount')
        }

        // 组件将要卸载的钩子
        componentWillUnmount() {
            console.log('Count---componentWillUnmount')
        }

        //控制组件更新的“阀门”
        shouldComponentUpdate() {
            console.log('Count---shouldComponentUpdate')
            return true
        }

        //组件将要更新的钩子
        componentWillUpdate() {
            console.log('Count---componentWillUpdate')
        }

        //组件更新完毕的钩子
        componentDidUpdate() {
            console.log('Count---componentDidUpdate')
        }

        render() {
            console.log('Count---render')
            const {count} = this.state
            return (
                <div>
                    <h2>当前求和为:{count}</h2>
                    <button onClick={this.add}>点我+1</button>
                    <button onClick={this.death}>卸载组件</button>
                </div>
            )
        }
    }

    //2.渲染组件到页面
    ReactDOM.render(<Count></Count>, document.getElementById('test'))
</script>
</body>
</html>

react生命周期(l日)_forceUpdate流程

8.虚拟DOM与DOM Diffing算法

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

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

相关文章

毛玻璃态计算器

效果展示 页面结构组成 从上述的效果可以看出&#xff0c;计算机的页面比较规整&#xff0c;适合grid布局。 CSS3 知识点 grid 布局 实现计算机布局 <div class"container"><form class"calculator" name"calc"><input type…

【无标题】ICCV 2023 | CAPEAM:基于上下文感知规划和环境感知记忆机制构建具身智能体

文章链接&#xff1a; https://arxiv.org/abs/2308.07241 2023年&#xff0c;大型语言模型&#xff08;LLMs&#xff09;以及AI Agents的蓬勃发展为整个机器智能领域带来了全新的发展机遇。一直以来&#xff0c;研究者们对具身智能&#xff08;Embodied Artificial Intelligenc…

macOS 14 Sonoma 如何删除不需要的 4k 动态壁纸

概览 在升级到 macOS 14&#xff08;Sonoma&#xff09;之后&#xff0c;小伙伴们惊喜发现  提供了诸多高清&#xff08;4k&#xff09;动态壁纸的支持。 现在&#xff0c;从锁屏到解锁进入桌面动态到静态的切换一气呵成、无比丝滑。 壁纸显现可谓是有了“天水相连为一色&…

卷发棒上架亚马逊美国销售需要做什么认证?卷发棒UL859测试报告

卷发棒是一种美发DIY工具&#xff0c;目前美发沙龙和发廊的的美发师都会使用一套卷发棒工具。卷发棒可以造出各种卷发。如&#xff1a;大波浪卷发、下垂自然卷发、垂至肩头卷发、碎卷、麦穗烫、内翻式卷发、外翻式卷发。目前很多家庭会自己备有这样的产品DIY。 什么是UL检测报告…

脉冲法和方向盘转角法计算车辆位置不同应用工况

1 脉冲法计算车辆位置 在定义下的世界坐标系中&#xff0c;车辆运动分为右转后退、右转前进、左转后退、左转前进、直线前进、直线后退和静止七种工况&#xff0c;因此需要推倒出一组包含脉冲、车辆运动方向和车辆结构尺寸参数的综合方程式进行车辆轨迹的实时迭代计算。由于直…

源码编译tcpreplay,及使用方法

编译步骤: 下载源码 解压 ./configure make sudo make install 使用方法: tcpreplay --loop1 --intf1网卡名 -x1 pcap文件名 实测结果: 左边是输入的tcpreplay命令 右边是tcpdump截获的udp包

你熟悉Docker吗?

你熟悉Docker吗&#xff1f; 文章目录 你熟悉Docker吗&#xff1f;快速入门Docker安装1.卸载旧版2.配置Docker的yum库3.安装Docker4.启动和校验5.配置镜像加速5.1.注册阿里云账号5.2.开通镜像服务5.3.配置镜像加速 部署MySQL镜像和容器命令解读 Docker基础常用命令数据卷数据卷…

Linux常见指令(1)

Linux常见指令[1] 一.前言1.操作系统简述 二.Linux常见指令1.登录Xshell2.Linux下的常见命令1.pwd2.ls1.ls -a2.ls -d3.ls -l 3.cd Linux中的文件系统1.文件的相关知识2.Linux下目录结构的认识1.什么叫做路径?2.Linux的整体目录结构3.为什么要有路径呢?4.绝对路径与相对路径 …

2023彩虹全新SUP模板,知识付费模板,卡卡云模板

源码介绍&#xff1a; 2023彩虹全新SUP模板/知识付费模板/卡卡云模板&#xff0c;首页美化&#xff0c;登陆页美化&#xff0c;修复了pc端购物车页面显示不正常的问题。 请自行查毒。感觉彩虹不少源码可能都有不干净的东西 安装教程&#xff1a; 1.将这俩个数据库文件导入数据…

队列的各个函数的实现

1.第一个结构是存放链表的数据&#xff0c;第二个结构体是存放头节点和尾节点的以方便找到尾节点&#xff0c;存放头节点的是phead&#xff0c;尾节点的是ptail typedef struct QueueNode {struct QueueNode* next;//单链表QDataType data;//放数据 }QNode;typedef struct Queu…

使用U3D、pico开发VR(二)——添加手柄摇杆控制移动

一、将unity 与visual studio 相关联 1.Edit->Preference->External tool 选择相应的版本 二、手柄遥控人物转向和人物移动 1.添加Locomotion System组件 选择XR Origin&#xff1b; 2.添加Continuous Move Provider&#xff08;Action-based&#xff09;组件 1>…

26962-2011 高频电磁场综合水处理器技术条件

声明 本文是学习GB-T 26962-2011 高频电磁场综合水处理器技术条件. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了高频电磁场综合水处理器(以下简称处理器)的术语和定义、分类和型号、结构型式、 要求及检验、标志、包装和贮运…

Opengl之抛光物

我们目前使用的光照都来自于空间中的一个点。它能给我们不错的效果,但现实世界中,我们有很多种类的光照,每种的表现都不同。将光投射(Cast)到物体的光源叫做投光物(Light Caster) 平行光 当一个光源处于很远的地方时,来自光源的每条光线就会近似于互相平行。不论物体和/或…

基于Java的会员管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

【李沐深度学习笔记】图片分类数据集

课程地址和说明 图片分类数据集p3 本系列文章是我学习李沐老师深度学习系列课程的学习笔记&#xff0c;可能会对李沐老师上课没讲到的进行补充。本文还参考了【李沐3】3.5、图像分类数据集 图片分类数据集 MNIST数据集是图像分类中广泛使用的数据集之一&#xff0c;但作为基…

C语言——动态内存管理详解(内存结构、动态内存函数、易错题、柔性数组)

本篇概要 本篇文章从基本出发讲述为什么要存在动态内存分配&#xff0c;动态内存函数有哪些&#xff0c;常见的动态内存错误&#xff0c;一些关于内存分配的练习题以及柔性数组的相关知识。 文章目录 本篇概要1.为什么存在动态内存分配1.1为什么要动态分配内存1.2内存结构 2.常…

Unity实现设计模式——状态模式

Unity实现设计模式——状态模式 状态模式最核心的设计思路就是将对象的状态抽象出一个接口&#xff0c;然后根据它的不同状态封装其行为&#xff0c;这样就可以实现状态和行为的绑定&#xff0c;最终实现对象和状态的有效解耦。 在实际开发中一般用到FSM有限状态机的实现&…

idea Springboot 教师标识管理系统开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 教师标识管理系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统 具有完整的源代码和数据库&…

8个居家兼职,帮助自己在家搞副业

越来越多的人开始追求居家工作的机会&#xff0c;无论是为了获得更多收入以改善生活质量&#xff0c;还是为了更好地平衡工作和家庭的关系&#xff0c;居家兼职已成为一种趋势。而在家中从事副业不仅能够为我们带来额外的收入&#xff0c;更重要的是&#xff0c;它可以让我们在…

c#中的接口

使用IEnumerable统一迭代变量类型 class Program {static void Main(string[] args){int[] nums1 new int[] { 1, 2, 3, 4, 5 };ArrayList nums2 new ArrayList { 1, 2, 3, 4, 5 };Console.WriteLine(Sum(nums1));Console.WriteLine(Sum(nums2));Console.WriteLine(Avg(nums…