React面向组件编程

news2024/11/25 2:26:14

React面向组件编程

  • 基本理解和使用
  • 组件三大核心属性1: state
    • 效果
    • 理解
    • 强烈注意
  • 组件三大核心属性2: props
    • 效果
    • 理解
    • 作用
    • 编码操作
  • 组件三大核心属性3: refs与事件处理
    • 效果
    • 理解
    • 编码
    • 2.4.4. 事件处理
  • 收集表单数据
    • 效果
    • 理解
  • 组件的生命周期(重要)
    • 效果
    • 理解
    • 生命周期流程图(旧)
    • 生命周期流程图(新)
    • 重要的勾子
    • 即将废弃的勾子

基本理解和使用

使用React开发者工具调试
在这里插入图片描述
效果
函数式组件:
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>使用jsx创建虚拟DOM</title>
</head>

<body>
    <!--准备好一个容器-->
    <div id="test">

    </div>


    <!--react的核心库-->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <!--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>


    <!-- babel将jsx代码翻译为js代码 -->
    <script type="text/babel">
        // 1. 创建函数式组件,组件首字母大写
        function MyComponent(){
            console.log(this)       //  此处的this时undefined,因为Babel编译后开启了严格模式
            return <h2>我是用函数定义的组件(适用于【简单组件】的定义)</h2>
        }
        // 2.渲染组件到页面
        ReactDOM.render(<MyComponent/>, document.getElementById('test'))

        /**
         *  执行了ReactDOM.render(<MyComponent/>, document.getElementById('test')))之后发生了什么
         *      1.react会解析组件标签,找到了MyComponent组件
         *      2.发现组件是使用函数定义的,随后调用该函数,蒋返回的虚拟DOM转为真实DOM,随后呈现在页面中
         * **/
    </script>
</body>

</html>

类式组件:

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>使用jsx创建虚拟DOM</title>
</head>

<body>
    <!--准备好一个容器-->
    <div id="test">

    </div>


    <!--react的核心库-->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <!--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>


    <!-- babel将jsx代码翻译为js代码 -->
    <script type="text/babel">
        // 1. 创建类式组件,必须要继承React.Component
        class MyComponent extends React.Component{
            render(){
                // render方法放在了那里?- MyComponent类的原型对象上,供实例对象使用
                // render中的this实施诶---MyComponent组件实例对象
                console.log("render中的this:", this)
                return <h2>我是用类定义的组件(适用于【复杂组件】的定义)</h2>
            }

        }

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

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

         /**
          * 组件的三大属性:
            props:{}
            refs:{}
            state:null
          * **/
    </script>
</body>

</html>

复杂组件的状态state如何理解:
组件中的状态驱动页面渲染
组件实例对象生成的state

注意
1.组件名必须首字母大写
2.虚拟DOM元素只能有一个根元素
3.虚拟DOM元素必须有结束标签

渲染类组件标签的基本流程
1.React内部会创建组件实例对象
2.调用render()得到虚拟DOM, 并解析为真实DOM
3.插入到指定的页面元素内部

组件三大核心属性1: state

效果

需求: 定义一个展示天气信息的组件
1.默认展示天气炎热 或 凉爽

2.点击文字切换天气

state.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>使用jsx创建虚拟DOM</title>
</head>

<body>
    <!--准备好一个容器-->
    <div id="test">

    </div>


    <!--react的核心库-->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <!--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>


    <!-- babel将jsx代码翻译为js代码 -->
    <script type="text/babel">
        // let that
        
        // 1.创建组件
        class Weather extends React.Component{
            // 参数取决于new的时候需要传递的内容
            // 构造器调用几次?----- 1次
            constructor(props){
                console.log('constructor')
                super(props)
                // 初始化状态
                this.state = {isHot:false, wind:'微风'}
                // that = this
                // 解决changeWeather中this指向问题,将原型上的changeWeather挂在到实例对象上
                this.changeWeather = this.changeWeather.bind(this)
            }
            
            // render调用几次-----1+n次,1是初始化次数,n是状态更新的次数
            render(){
                console.log('render')
                // 读取状态
                const {isHot, wind} = this.state
                // react中onClick要大写,函数后面不需要加括号,只用指定函数,由react调用
                return <h1 onClick = {this.changeWeather}> 今天天气很{isHot ? '炎热':'凉爽'} , {wind}</h1>
            }
            
            // changeWeaher调用几次?点几次调几次
            changeWeather(){
                // changeWeather放在那里-----类的原型对象上,供实例使用
                // 通过Weather实例对象调用changeWeather时,changeWeather中的this就是Weather实例
                // 为什么这里this.state是undefined,因为他不是通过实例调用
                // 由于changeWeather是作为onClick回调,所以不是通过实例嗲偶用的,是直接调用
                // 类中的方法默认开启了局部的严格模式,所以changeWeather中的this为undefined
                // console.log(this.state.isHot)

                // 获取原来的isHot值
                const isHot = this.state.isHot
                // 严重注意:状态state不能直接更改,下面这行就是直接更改,要借助一个内置API
                // this.state.isHot = !isHot   // 这是错误写法
                // 严重注意,状态必须通过setState更改,且更新是一种合并的操作
                this.setState({isHot:!isHot})
            }
        }

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

        // const title = document.getElementById('title')
        // title.addEventListener('click', ()=>{
        //     console.log("标题被点击了")
        // })

        // const title = document.getElementById('title')
        // title.onclick = ()=>{
        //     console.log("标题被点击了")
        // }
        // function changeWeather(){
        //     alert('此处修改isHot的值')
        //     // 这里的this是window
        //     // const {isHot} = this.state
        //     // console.log(isHot)
        //     console.log(that.state.isHot)
        // }
    </script>
</body>

</html>

间写

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>使用jsx创建虚拟DOM</title>
</head>

<body>
    <!--准备好一个容器-->
    <div id="test">

    </div>


    <!--react的核心库-->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <!--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>


    <!-- babel将jsx代码翻译为js代码 -->
    <script type="text/babel">

        class Weather extends React.Component{
        
            // 初始化状态
            state = {isHot:false, wind:'微风'}
            
            render(){
                const {isHot, wind} = this.state
                return <h1 onClick = {this.changeWeather}> 今天天气很{isHot ? '炎热':'凉爽'} , {wind}</h1>
            }
            
            // 自定义方法-----要用赋值语句的形式+箭头函数
            // 将function改成了箭头函数,可以实现,箭头函数没有自己的this,
            // 在里面写this不会报错,它会找外层函数的this,作为箭头函数的this去使用
            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,如何解决?
a)强制绑定this: 通过函数对象的bind()
b)箭头函数
3.状态数据,不能直接修改或更新

组件三大核心属性2: props

效果

需求: 自定义用来显示一个人员信息的组件

1.姓名必须指定,且为字符串类型;
2.性别为字符串类型,如果性别没有指定,默认为男
3.年龄为字符串类型,且为数字类型,默认值为18

在这里插入图片描述

理解

1.每个组件对象都会有props(properties的简写)属性
2.组件标签的所有属性都保存在props中

作用

1.通过标签属性从组件外向组件内传递变化的数据
2.注意: 组件内部不要修改props数据

编码操作

1.内部读取某个属性值

this.props.name

2.对props中的属性值进行类型限制和必要性限制
第一种方式(React v15.5 开始已弃用):

Person.propTypes = {
name: React.PropTypes.string.isRequired,
age: React.PropTypes.number
}

第二种方式(新):使用prop-types库进限制(需要引入prop-types库)

Person.propTypes = {
name: PropTypes.string.isRequired,
age: PropTypes.number. 
}

3.扩展属性: 将对象的所有属性通过props传递

<Person {...person}/>

4.默认属性值:

Person.defaultProps = {
  age: 18,
  sex:'男'
}

5.组件类的构造函数

constructor(props){
  super(props)
  console.log(props)//打印所有属性
}

props基本使用

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>使用jsx创建虚拟DOM</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-->
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <!--引入babel,用于解析jsx语法为原生js语法-->
    <script type="text/javascript" src="../js/babel.min.js"></script>


    <!-- babel将jsx代码翻译为js代码 -->
    <script type="text/babel">
        // 1.创建组件
        class Person extends React.Component{
            render(){
                console.log(this.props)
                const {name, sex, age} = this.props
                return (
                    <ul>
                        <li>姓名:{name}</li>
                        <li>性别:{sex}</li>
                        <li>年龄:{age+1}</li>
                    </ul>
                )
            }
        }
        // 类似html标签key-value的形式,,注意要传递number类型的参数,不能直接使用引号,需要用大括号括起来
        // 对传递的标签属性age进行类型鉴定,name进行必要性鉴定,性别需要指定默认值
        ReactDOM.render(<Person name="tom" age={19} sex='女'/>, document.getElementById('test1'))
        ReactDOM.render(<Person name="java" age={20} sex='男'/>, document.getElementById('test2'))
        // 要保证两者属性名全部相同
        //仅适用于标签属性的传递
        const p = {name:'老刘', age:18, sex:'女'}
        ReactDOM.render(<Person {...p}/>, document.getElementById('test3'))

        // 传递props,就是传递标签属性
        

    </script>
</body>

</html>

props进行限制

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>使用jsx创建虚拟DOM</title>
</head>

<body>
    <!--准备好一个容器-->
    <div id="test1">
    </div>
    <div id="test2">
    </div>
    <div id="test3">
    </div>

    <!--react的核心库,React对象-->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <!--react的扩展库,专门用于操作DOM, ReactDom对象-->
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <!--引入babel,用于解析jsx语法为原生js语法-->
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <!---引入prop-types,用于对组件标签属性进行限制,PropType对象-->
    <script type="text/javascript" src="../js/prop-types.js"></script>

    <!-- babel将jsx代码翻译为js代码 -->
    <script type="text/babel">
        // 1.创建组件
        class Person extends React.Component{
            render(){
                console.log(this.props)
                const {name, sex, age} = this.props
                // props是只读的
                //this.props.name='java'      // 此行代码会报错,因为props是只读的
                return (
                    <ul>
                        <li>姓名:{name}</li>
                        <li>性别:{sex}</li>
                        <li>年龄:{age+1}</li>
                    </ul>
                )
            }
            
        }
        //对标签属性进行类型、必要性的限制
        Person.propTypes = {
            name:PropTypes.string.isRequired,           //限制name必传,且为字符串
            sex:PropTypes.string,       //限制sex字符串
            age:PropTypes.number,       //限制age为数值
            speak:PropTypes.func        //限制speak为函数
        }
        // 指定默认标签属性值
        Person.defaultProps = {
            sex:'男' ,     // sex默认值为男
            age:18         //age默认值为18
        }
        ReactDOM.render(<Person name="tom" age={19} sex='女'/>, document.getElementById('test1'))
        ReactDOM.render(<Person name="java" speak={speak}/>, document.getElementById('test2'))
        const p = {name:'老刘', age:18, sex:'女'}
        ReactDOM.render(<Person {...p}/>, document.getElementById('test3'))

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

</html>

props简写方式

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>使用jsx创建虚拟DOM</title>
</head>

<body>
    <!--准备好一个容器-->
    <div id="test1">
    </div>
    <div id="test2">
    </div>
    <div id="test3">
    </div>

    <!--react的核心库,React对象-->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <!--react的扩展库,专门用于操作DOM, ReactDom对象-->
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <!--引入babel,用于解析jsx语法为原生js语法-->
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <!---引入prop-types,用于对组件标签属性进行限制,PropType对象-->
    <script type="text/javascript" src="../js/prop-types.js"></script>

    <!-- babel将jsx代码翻译为js代码 -->
    <script type="text/babel">
        // 1.创建组件
        class Person extends React.Component {
            //对标签属性进行类型、必要性的限制
            static propTypes = {
                name: PropTypes.string.isRequired,           //限制name必传,且为字符串
                sex: PropTypes.string,       //限制sex字符串
                age: PropTypes.number,       //限制age为数值
                speak: PropTypes.func        //限制speak为函数
            }
            // 指定默认标签属性值
            static defaultProps = {
                sex: '男',     // sex默认值为男
                age: 18         //age默认值为18
            }
            render() {
                console.log(this.props)
                const { name, sex, age } = this.props
                // props是只读的
                //this.props.name = 'java'      // 此行代码会报错,因为props是只读的
                return (
                    <ul>
                        <li>姓名:{name}</li>
                        <li>性别:{sex}</li>
                        <li>年龄:{age + 1}</li>
                    </ul>
                )
            }

        }



        ReactDOM.render(<Person name="tom" age={19} sex='女' />, document.getElementById('test1'))
        ReactDOM.render(<Person name="java" speak={speak} />, document.getElementById('test2'))
        const p = { name: '老刘', age: 18, sex: '女' }
        ReactDOM.render(<Person {...p} />, document.getElementById('test3'))

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

</html>

props与构造器

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>使用jsx创建虚拟DOM</title>
</head>

<body>
    <!--准备好一个容器-->
    <div id="test1">
    </div>
    <div id="test2">
    </div>
    <div id="test3">
    </div>

    <!--react的核心库,React对象-->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <!--react的扩展库,专门用于操作DOM, ReactDom对象-->
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <!--引入babel,用于解析jsx语法为原生js语法-->
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <!---引入prop-types,用于对组件标签属性进行限制,PropType对象-->
    <script type="text/javascript" src="../js/prop-types.js"></script>

    <!-- babel将jsx代码翻译为js代码 -->
    <script type="text/babel">
        // 1.创建组件
        class Person extends React.Component {
            // 类中的构造器有什么作用呢?有必要传props吗?
            // 在react中,构造函数仅用于以下两种情况
            // 1.通过给this.state赋值对象来初始化内部state,2.为事件处理函数绑定实例
            // 类中的构造器可有可无
            // 在react组件挂在致癌案,会调用它的构造函数,在为react.component子类实现构造函数时,应在
            // 其他语句之前调用super(props),否则this.props在构造函数中可能会出现为定义异常
            constructor(props) {
                // 构造器是否接收props,是否传递给super,取决于:是否希望在构造器中通过this访问props
                console.log(props)
                super(props)
            }

            //对标签属性进行类型、必要性的限制
            static propTypes = {
                name: PropTypes.string.isRequired,           //限制name必传,且为字符串
                sex: PropTypes.string,       //限制sex字符串
                age: PropTypes.number,       //限制age为数值
                speak: PropTypes.func        //限制speak为函数
            }
            // 指定默认标签属性值
            static defaultProps = {
                sex: '男',     // sex默认值为男
                age: 18         //age默认值为18
            }
            render() {
                return (
                    <ul>
                        <li>姓名:{name}</li>
                        <li>性别:{sex}</li>
                        <li>年龄:{age + 1}</li>
                    </ul>
                )
            }

        }



        ReactDOM.render(<Person name="tom"/>, document.getElementById('test1'))
    </script>
</body>

</html>

函数式组件

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>使用jsx创建虚拟DOM</title>
</head>

<body>
    <!--准备好一个容器-->
    <div id="test1">
    </div>
    <div id="test2">
    </div>
    <div id="test3">
    </div>

    <!--react的核心库,React对象-->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <!--react的扩展库,专门用于操作DOM, ReactDom对象-->
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <!--引入babel,用于解析jsx语法为原生js语法-->
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <!---引入prop-types,用于对组件标签属性进行限制,PropType对象-->
    <script type="text/javascript" src="../js/prop-types.js"></script>

    <!-- babel将jsx代码翻译为js代码 -->
    <script type="text/babel">
        // 1.函数式组件只能使用props
        function Person(props) {
            const { name, age, sex } = props
            return (
                <ul>
                    <li>姓名:{name}</li>
                    <li>性别:{sex}</li>
                    <li>年龄:{age + 1}</li>
                </ul>
            )
        }
        //对标签属性进行类型、必要性的限制
        Person.propTypes = {
            name: PropTypes.string.isRequired,           //限制name必传,且为字符串
            sex: PropTypes.string,       //限制sex字符串
            age: PropTypes.number,       //限制age为数值
            speak: PropTypes.func        //限制speak为函数
        }
        // 指定默认标签属性值
        Person.defaultProps = {
            sex: '男',     // sex默认值为男
            age: 18         //age默认值为18
        }

        ReactDOM.render(<Person name="tom" />, document.getElementById('test1'))
    </script>
</body>

</html>

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

效果

需求: 自定义组件, 功能说明如下:

点击按钮, 提示第一个输入框中的值
当第2个输入框失去焦点时, 提示这个输入框中的值

在这里插入图片描述

理解

组件内的标签可以定义ref属性来标识自己(类似id)

编码

1.字符串形式的ref

<input ref="input1"/>
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>使用jsx创建虚拟DOM</title>
</head>

<body>
    <!--准备好一个容器-->
    <div id="test">

    </div>


    <!--react的核心库-->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <!--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>


    <!-- babel将jsx代码翻译为js代码 -->
    <script type="text/babel">
        // 1. 创建类式组件,必须要继承React.Component
        class Demo extends React.Component{
            // 展示左侧输入框的数据
            showData = ()=>{
                // 注意收集出来的属性是refs
                const {input1} = this.refs
                console(input1)
                alert(input1.value)
                
            }
            // 展示右侧输入框的数据
            showData2 = ()=>{
                const {input2} = this.refs
                alert(input2.value)
                
            }
            render(){
                return (
                    // 打了标识之后,都收集到组件对象的refs属性中
                    <div>
                        <input ref = "input1" type="text" placeholder="点击按钮提示数据"/>
                        <button ref = "button1" onClick={this.showData}>点我提示左侧的数据</button>
                        <input onBlur = {this.showData2} ref = "input2" type="text" placeholder="失去焦点提示数据"/>  
                    </div>

                )
            }

        }

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

    </script>
</body>

</html>

2.回调形式的ref

<input ref={(c)=>{this.input1 = c}}/>
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>使用jsx创建虚拟DOM</title>
</head>

<body>
    <!--准备好一个容器-->
    <div id="test">

    </div>


    <!--react的核心库-->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <!--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>


    <!-- babel将jsx代码翻译为js代码 -->
    <script type="text/babel">
        // 1. 创建类式组件,必须要继承React.Component
        class Demo extends React.Component{
            // 展示左侧输入框的数据
            showData = ()=>{
                const{input1} = this
                alert(input1.value)
            }
            // 展示右侧输入框的数据
            showData2 = ()=>{
                const {input2} = this
                alert(input2.value)
                
            }
            render(){
                return (
                    // 打了标识之后,都收集到组件对象的refs属性中
                    /**
                     * <input ref = {(a)=>{this.input1 = a}} type="text" placeholder="点击按钮提示数据"/>
                     * 这句的含义是把ref当前所处的节点挂在了当前实例自身上,并且取了个名字叫input1
                     * react会自动帮你调用回调函数
                     * **/
                    <div>
                        
                        <input ref = {c => this.input1 = c } type="text" placeholder="点击按钮提示数据"/>
                        <button ref = "" onClick={this.showData}>点我提示左侧的数据</button>
                        <input onBlur = {this.showData2} ref = {c => this.input2 = c } type="text" placeholder="失去焦点提示数据"/>
                    </div>

                )
            }

        }

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

    </script>
</body>

</html>

回调中的函数执行次数

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>使用jsx创建虚拟DOM</title>
</head>

<body>
    <!--准备好一个容器-->
    <div id="test">

    </div>


    <!--react的核心库-->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <!--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>


    <!-- babel将jsx代码翻译为js代码 -->
    <script type="text/babel">
        // 1. 创建类式组件,必须要继承React.Component
        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 = (c)=>{
                this.input1 = c;
                console.log('@',c)

            }
            render(){
                const {isHot} = this.state
                return (
                    /**
                     * 如果 ref 回调函数是以内联函数的方式定义的,在更新过程中它会被执行两次,第一次传入参数 null,然后第二次会传入参数 DOM 元素。
                     * 这是因为在每次渲染时会创建一个新的函数实例,所以 React 清空旧的 ref 并且设置新的。
                     * 通过将 ref 的回调函数定义成 class 的绑定函数的方式可以避免上述问题,但是大多数情况下它是无关紧要的。
                     * **/
                    <div>
                        <h2>今天天气很{isHot ? '炎热':'寒冷'} </h2>
                        {/*<input ref = {(c) => {this.input1 = c;console.log('@', c);}} type="text" />*/}
                        <input ref = {this.saveInput} type="text" />
                        <button onClick={this.showInfo}>点我提示左侧的数据</button>
                        <button onClick={this.changeWeather}>点我切换天气</button>
                    </div>

                )
            }

        }

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

    </script>
</body>

</html>

3.createRef创建ref容器·

myRef = React.createRef() 
<input ref={this.myRef}/>
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>使用jsx创建虚拟DOM</title>
</head>

<body>
    <!--准备好一个容器-->
    <div id="test">

    </div>


    <!--react的核心库-->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <!--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>


    <!-- babel将jsx代码翻译为js代码 -->
    <script type="text/babel">
        // 1. 创建类式组件,必须要继承React.Component
        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="点击按钮提示数据"/>
                        <button ref = "" onClick={this.showData}>点我提示左侧的数据</button>
                        <input onBlur={this.showData2} ref = {this.myRef2} type="text" placeholder="失去焦点提示数据"/>
                    </div>

                )
            }

        }

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

    </script>
</body>

</html>

2.4.4. 事件处理

1.通过onXxx属性指定事件处理函数(注意大小写)

  • 1)React使用的是自定义(合成)事件, 而不是使用的原生DOM事件
  • 2)React中的事件是通过事件委托方式处理的(委托给组件最外层的元素)

2.通过event.target得到发生事件的DOM元素对象

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>使用jsx创建虚拟DOM</title>
</head>

<body>
    <!--准备好一个容器-->
    <div id="test">

    </div>


    <!--react的核心库-->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <!--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 Demo extends React.Component {
            /**
             *  1.通过onXxx属性指定事件处理函数(注意大小写,react是大写,原生是小写),
                    1)React使用的是自定义(合成)事件, 而不是使用的原生DOM事件        为了更好的兼容性
                    2)React中的事件是通过事件委托方式处理的(委托给组件最外层的元素)   为了更高效
                2.通过event.target得到发生事件的DOM元素对象     ----不要过度使用ref
             * **/
            // 创建ref容器
            myRef = React.createRef()
            myRef2 = React.createRef()
            // 展示左侧输入框的数据
            showData = () => {
                alert(this.myRef.current.value)
            }
            // 展示右侧输入框的数据
            showData2 = () => {
                alert(event.target.value)

            }
            render() {
                return (
                    <div>

                        <input ref={this.myRef} type="text" placeholder="点击按钮提示数据" />
                        <button ref="" onClick={this.showData}>点我提示左侧的数据</button>
                        {/**发生事件的元素是正要操作的元素,ref可以省略**/}
                        <input onBlur={this.showData2} type="text" placeholder="失去焦点提示数据" />
                    </div>

                )
            }

        }

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

</html>

收集表单数据

效果

需求: 定义一个包含表单的组件 输入用户名密码后, 点击登录提示输入信息
在这里插入图片描述

理解

包含表单的组件分类

1.受控组件

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>使用jsx创建虚拟DOM</title>
</head>

<body>
    <!--准备好一个容器-->
    <div id="test">

    </div>


    <!--react的核心库-->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <!--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>


    <!-- babel将jsx代码翻译为js代码 -->
    <script type="text/babel">
        // 随着输入维护状态,就称之为非受控组件
        // 创建组件
        class Login extends React.Component{
            
            state = {
                username:'',        //用户名
                password:''         //密码
            }
            handleSubmit = (event)=>{
                event.preventDefault()  //  阻止表单提交,不会跳转到新的页面
                const {username, password} = this.state
                alert(`输入的用户名是:${username}, 你输入的密码是:${password}`)
            }

            // 保存用户名到状态中
            saveUsername = (event)=>{
                this.setState({username: event.target.value})
            }

            // 保存用户名到密码中
            savePassword = (event)=>{
                this.setState({password: event.target.value})
            }

            render() {
                return (
                    // 不指定的话,默认发get请求,带的参数默认是get参数
                    <form action="http://www.baidu.com" onSubmit={this.handleSubmit}>
                        用户名:<input onChange={this.saveUsername} type = "text" name ="username"/>
                        密码:<input onChange={this.savePassword} type = "password" name="password"/>
                        <button>登陆</button>
                    </form>
                )
            }
        }
        ReactDOM.render(<Login/>, document.getElementById('test'))
    </script>
</body>

</html>

2.非受控组件

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>使用jsx创建虚拟DOM</title>
</head>

<body>
    <!--准备好一个容器-->
    <div id="test">

    </div>


    <!--react的核心库-->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <!--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>


    <!-- babel将jsx代码翻译为js代码 -->
    <script type="text/babel">
        // 创建组件
        class Login extends React.Component{
            // 页面所有输入类的dom,都是现用现取,就是非受控组件
            // 
            handleSubmit = (event)=>{
                event.preventDefault()  //  阻止表单提交,不会跳转到新的页面
                const {username, password} = this
                alert(`输入的用户名是:${username.value}, 你输入的密码是:${password.value}`)
            }
            render() {
                return (
                    // 不指定的话,默认发get请求,带的参数默认是get参数
                    <form action="http://www.baidu.com" onSubmit={this.handleSubmit}>
                        用户名:<input ref={c=>this.username=c} type = "text" name ="username"/>
                        密码:<input ref={c=>this.password=c} type = "password" name="password"/>
                        <button>登陆</button>
                    </form>
                )
            }
        }
        ReactDOM.render(<Login/>, document.getElementById('test'))
    </script>
</body>

</html>

组件的生命周期(重要)

效果

需求:定义组件实现以下功能:

让指定的文本做显示 / 隐藏的渐变动画
从完全可见,到彻底消失,耗时2S
点击“不活了”按钮从界面中卸载组件

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>使用jsx创建虚拟DOM</title>
</head>

<body>
    <!--准备好一个容器-->
    <div id="test">

    </div>


    <!--react的核心库-->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <!--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">
        // 创建组件
        // 生命周期回调函数<===>生命周期钩子函数
        // react会在合适的时机把函数勾起来执行。

        class Life extends React.Component {
            // 状态的数据驱动页面的更新
            state = { opacity: 1 }
            death = () => {
                // 卸载组件unmount
                ReactDOM.unmountComponentAtNode(document.getElementById('test'))

            }
            // action =()=>{
            //     setInterval(()=>{
            //         // 获取原来状态
            //         let {opacity} = this.state
            //         // 减小0.1
            //         opacity -= 1
            //         if (opacity <= 0) opacity = 1
            //         // 设置新的透明度
            //         this.setState({opacity})
            //     }, 200);
            // }
            // 名字一定不要写错
            // 组件挂载完毕之后调用
            componentDidMount() {
                
                this.timer = setInterval(() => {
                    // 获取原来状态
                    let { opacity } = this.state
                    // 减小0.1
                    opacity -= 0.1
                    if (opacity <= 0) opacity = 1
                    // 设置新的透明度
                    this.setState({opacity})
                }, 200);
            }
            
            //组件将要卸载
            componentWillUnmount(){
                // 清空定时器
                clearInterval(this.timer)
            }

            // render调用1+n次,调用的时机:初始化渲染,状态更新之后
            render() {
                // 无线递归,定时器每隔200s都会更新状态,更新状态就会导致组件重新挂在,render再次执行,定时器又重新初始化了
                // 
                console.log('render')
                // setInterval(()=>{
                //     // 获取原来状态
                //     let {opacity} = this.state
                //     // 减小0.1
                //     opacity -= 1
                //     if (opacity <= 0) opacity = 1
                //     // 设置新的透明度
                //     this.setState({opacity})
                // }, 200);
                return (
                    <div>
                        <h2 style={{ opacity: this.state.opacity }}>React学不会怎么办</h2>
                        <button onClick={this.death}>不活了</button>
                        <button onClick={this.action}>开始变化</button>
                    </div>
                )
            }
        }
        // 渲染组件,实际上就是挂载(mount),
        ReactDOM.render(<Life />, document.getElementById('test'))
    </script>
</body>

</html>

理解

1.组件从创建到死亡它会经历一些特定的阶段。
2.React组件中包含一系列勾子函数(生命周期回调函数), 会在特定的时刻调用。
3.我们在定义组件时,会在特定的生命周期回调函数中,做特定的工作。

生命周期流程图(旧)

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>使用jsx创建虚拟DOM</title>
</head>

<body>
    <!--准备好一个容器-->
    <div id="test">

    </div>


    <!--react的核心库-->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <!--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">
        /**
         *  componentDidMount().  =====》常用
                一般在这个钩子中做一些初始化的事,例如:开启定时器,发送网络请求,订阅消息
            componentWillUnmount() ====》常用
                一般在这个钩子中做一些收尾的事,例如:关闭定时器、取消订阅消息

         * 
         * **/

        class Count extends React.Component {
            // 构造器
            constructor(props) {
                console.log('Count-constructor')
                super(props)
                // 初始化状态
                this.state = { count: 0 }
            }

            //加1按钮的回调
            add = () => {
                // 获取原来的状态
                const { count } = this.state
                this.setState({ count: count + 1 })
            }

            // 卸载组件的回调
            death = () => {
                // 卸载组件unmount
                ReactDOM.unmountComponentAtNode(document.getElementById('test'))
            }

            // 强制更新按钮的回调
            force = () => {
                this.forceUpdate()
            }
            // 组件将要挂在的钩子
            componentWillMount() {
                console.log('Count-componentWillMount')
            }

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

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

            // 控制组件更新的阀门
            shouldComponentUpdate() {
                console.log('Count-shouldComponentUpdate')
                // 不写返回值,默认为true
                // 如果是true,每次更新state的时候,都会调用一次render,如果是false,包含render在内的3个函数都不会调用
                return true
            }

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

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


            render() {
                console.log('render')
                const { count } = this.state
                return (
                    <div>
                        <h2>当前求和为{count}</h2>
                        <button onClick={this.add}>点我+1</button>
                        <button onClick={this.death}>点我卸载</button>
                        <button onClick={this.force}>不修改任何状态中的数据,强制更新一下</button>
                    </div>
                )
            }
        }

        // 父组件A
        class A extends React.Component {
            // 初始化状态
            state = { carName: '奔驰' }
            changeCar = () => {
                this.setState({ carName: '宝马' })
            }
            render() {
                return (
                    <div>
                        <div>我是A组件</div>
                        <button onClick={this.changeCar}>换车</button>
                        <B carName={this.state.carName} />
                    </div>
                )
            }
        }

        // 子组件B
        class B extends React.Component {
            componentDidMount() {
                console.log("B---componentDidMount")
            }
            // 组件将要接收props调用,(第一次不调用,之后调用)
            componentWillReceiveProps() {
                console.log("B---componentWillReceiveProps", this.props)
            }

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

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

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

            render() {
                console.log('B-render')
                return (
                    <div>我是B组件,接收到的车是:{this.props.carName}</div>
                )
            }
        }
        // 渲染组件,实际上就是挂载(mount),
        ReactDOM.render(<Count />, document.getElementById('test'))

    </script>
</body>

</html>

生命周期的三个阶段(旧)

初始化阶段: 由ReactDOM.render()触发—初次渲染

1.constructor()
2.componentWillMount()
3.render()
4.componentDidMount().  =====》常用
一般在这个钩子中做一些初始化的事,例如:开启定时器,发送网络请求,订阅消息

更新阶段: 由组件内部this.setSate()或父组件重新render触发

1.shouldComponentUpdate()
2.componentWillUpdate()
3.render()
4.componentDidUpdate()

卸载组件: 由ReactDOM.unmountComponentAtNode()触发

1.componentWillUnmount() ====》常用
一般在这个钩子中做一些收尾的事,例如:关闭定时器、取消订阅消息

生命周期流程图(新)

在这里插入图片描述
新版本和旧版本相比,废弃了componentWillMount、componentWillReceiveProps、componentWillUpdate,提出了两个新的getDerivedStateFromProps、getSnapshotBeforeUpdate方法

初始化阶段: 由ReactDOM.render()触发—初次渲染

1.constructor()
2.getDerivedStateFromProps
3.render()
4.componentDidMount()

更新阶段: 由组件内部this.setSate()或父组件重新render触发

1.getDerivedStateFromProps
2.shouldComponentUpdate()
3.render()
4.getSnapshotBeforeUpdate
5.componentDidUpdate()

卸载组件: 由ReactDOM.unmountComponentAtNode()触发

1.componentWillUnmount()

重要的勾子

1.render:初始化渲染或更新渲染调用
2.componentDidMount:开启监听, 发送ajax请求
3.componentWillUnmount:做一些收尾工作, 如: 清理定时器

即将废弃的勾子

1.componentWillMount
2.componentWillReceiveProps
3.componentWillUpdate

现在使用会出现警告,下一个大版本需要加上UNSAFE_前缀才能使用,以后可能会被彻底废弃,不建议使用。

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

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

相关文章

《庖丁解牛Linux内核分析》课后实验:实验一:反汇编分析

实验内容 参照第 1.3 节&#xff0c;将如下 C 语言代码汇编成“.s”文件&#xff0c;并分析“.s”文件中的汇编代码 的执行过程&#xff0c;其中重点关注 EBP/ESP 寄存器、EAX 寄存器、EIP 寄存器和函数调用堆栈空 间在汇编代码的执行过程是如何变化的。 int g(int x) { return…

省钱!NewBing硬核新玩法;手把手教你训练AI模特;用AI替代同事的指南;B站最易上手AI绘画教程 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 『NewBing 的2种硬核新用法』阅读文档并回答问题 & AI绘图 社区同学分享了两种NewBing的新用法&#xff0c;不仅准确高效&#x…

2023年湖北省武汉安全员ABC报名时间考试通过率如何?启程别

2023年湖北省武汉安全员ABC报名时间考试通过率如何&#xff1f;启程别 都2023年了&#xff0c;建筑企业想要报考三类人员&#xff0c;不知道在哪里报名&#xff0c;具备什么样的条件才可以报考建筑安全员abc,什么时间报名考试等等一系列问题&#xff0c;启程别来给你们细细说明…

即时通讯源码自己开发好还是对接云服务好

随着科技的飞速发展&#xff0c;通信技术也日新月异。与此同时&#xff0c;即时通讯应用也越来越受欢迎。许多企业在构建应用程序时会遇到一个问题&#xff1a;使用即时通讯源码自己开发好还是对接云服务好&#xff1f;本文将探讨这两种方法的优缺点&#xff0c;并为您提供一些…

环境配置 | Win10 VSCode连接远程服务器里的docker容器

环境&#xff1a;win10, VS code, 远程服务器Ubuntu16.04&#xff08;远程服务器上已经安装好了dockers&#xff09;, 1.VScode下载 网址&#xff1a;Download Visual Studio Code - Mac, Linux, Windows 下载后双击运行 2.VSCode上配置 STEP 1.点击vscode右边工具栏点击拓展…

《嵌入式系统的WEB开发》

硬件平台&#xff1a;RK1109/T31/RK3308 软件系统&#xff1a;Linux&#xff0c;Lighttpd/ Nginx, FCGI, HTML/JS 选择使用FCGI&#xff0c;除了使用C 开发调用系统资源方便外. FCGI 可以解决CGI 多入口的问题&#xff0c;统一的入口&#xff0c;对数据同步&#xff0c;都是比…

Python 基于 Django 的学生成绩管理系统,可视化界面(附源码,教程)

1简介 对于学生成绩管理系统&#xff0c;充分运用现代化的信息技术手段&#xff0c;对于学生成绩信息管理发展的趋势就是信息化&#xff0c;信息化时代下的信息管理&#xff0c;需要深化信息管理体制与手段的改革&#xff0c;充分运用信息化手段来全方位的进行学生成绩管理系统…

VTK交互功能-callback/observe模式-vtkCommand

前言&#xff1a;本博文为系列博文&#xff0c;尝试将vtk交互功能讲清楚&#xff0c;包括常用的接口分析、常用的交互逻辑以及常用的交互Widget。若各位小伙伴有需要请多多关注&#xff0c;也希望能给各位小伙伴有所帮助。vtkCommand作为callback/obseve交互模式的基类&#xf…

0201自动配置类的导入-自动装配原理-springboot2.7.x系列

1简介 Spring Boot是基于Spring框架的&#xff0c;它的原理也是基于Spring框架的。 Spring框架是一个非常强大的框架&#xff0c;它提供了一系列的模块来帮助开发人员构建企业级的应用程序。Spring框架的核心是控制反转&#xff08;Inversion of Control&#xff0c;IoC&…

大数据技术之Spark Streaming概述

前言 数据处理延迟的长短 实时数据处理&#xff1a;毫秒级别离线数据处理&#xff1a;小时 or 天 数据处理的方式 流式&#xff08;streaming&#xff09;数据处理批量&#xff08;batch&#xff09;数据处理 spark Streaming也是基于sparkCore&#xff0c;所以底层的核心没有变…

FreeRTOS系统学习第一步:新建 FreeRTOS 工程—软件仿真

创建一个FreeRTOS系统工程 1.新建工程文件夹2.Keil新建工程2.1 New Project2.2 Select Device For Target2.3 Manage Run-Time Environment 3. 在 KEIL 工程里面新建文件组3.1在 KEIL 工程里面添加文件 4. 编写 main 函数5. 调试配置5.1 设置软件仿真5.2 修改时钟大小在时钟相关…

你是否线上有使用ThreadLocal,如果结合多线程,请慎用

随着业务的增加&#xff0c;数据量的增加&#xff0c;多线程的使用会越来越频繁&#xff0c;提升单机的处理能力。 前些日子我们线上出现了一个比较严重的故障&#xff0c;这个故障是多线程使用不当引起的&#xff0c;挺有代表性的&#xff0c;所以分享给大家&#xff0c;希望…

前端学习笔记:CSS的引入,元素选择器

这是本人学习的总结&#xff0c;主要学习资料如下 马士兵教育 目录 1、引入CSS1.1、引入CSS的方式1.2、优先级 2、元素选择器2.1、基本选择器2.1.1、选择器2.1.2、优先级 2.2、关系选择器2.2.1、优先级 2.3、属性选择器2.4、伪类选择器 1、引入CSS 1.1、引入CSS的方式 第一个…

互斥锁深度理解与使用

大家好&#xff0c;我是易安! 我们知道一个或者多个操作在CPU执行的过程中不被中断的特性&#xff0c;称为“原子性”。理解这个特性有助于你分析并发编程Bug出现的原因&#xff0c;例如利用它可以分析出long型变量在32位机器上读写可能出现的诡异Bug&#xff0c;明明已经把变量…

SpringCloud--gateway 网关

在Spring Cloud中&#xff0c;使用Gateway网关访问服务可以有多种好处&#xff0c;包括但不限于以下几点&#xff1a; 统一入口管理&#xff1a;Gateway作为统一的服务入口&#xff0c;可以对所有的请求进行统一管理和控制&#xff0c;实现微服务集中管理。 动态路由&#xff…

056:cesium 七种方法设置颜色

第056个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置颜色,这里用到了7种方法,查看API,还有很多种方法 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共115行)相关API参考:专栏目标示例效果 配置…

深入理解Go语言中的接口编程【17】

文章目录 接口接口接口类型为什么要使用接口接口的定义实现接口的条件接口类型变量值接收者和指针接收者实现接口的区别值接收者实现接口指针接收者实现接口下面的代码是一个比较好的面试题 类型与接口的关系一个类型实现多个接口多个类型实现同一接口接口嵌套 空接口空接口的定…

TCP教程:详解TCP连接过程

目录标题 一 、简述二 、TCP建立连接协议&#xff08;三次握手&#xff09;2.1 概述及目的2.2 第一次握手&#xff1a;客户端发送SYN报文2.3 第二次握手&#xff1a;服务器回应SYN-ACK报文2.4 第三次握手&#xff1a;客户端回应ACK报文2.5 顾客预定座位场景2.6底层原理2.7 TCP …

嵌入式之Samba服务器搭建

在嵌入式系统开发应用平台中&#xff0c;tftp、nfs和samba服务器是最常用的文件传输工具 tftp和nfs是在嵌入式Linux开发环境中经常使用的传输工具 samba则是Linux和Windows之间的文件传输工具。 下面演示在linux上搭建Samba服务器 sudo apt-get install samba chmod -R 77…

会场安排问题——算法实现(C实现)

问题描述&#xff1a;加入要在足够多的会场里安排一批活动&#xff0c;并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。&#xff08;这个问题实际上是著名的图着色问题。若每个活动作为图的一个顶点&#xff0c;不相容活动之间用边相连。使相连顶点着有不同颜色的…