React基础知识笔记

Reat简介

React:用于构建用户界面的 JavaScript 库。由 Facebook 开发且开源。是一个将视图渲染为html视图的开源库

第一章:React入门

相关js库

  • react.development.js :React 核心库
  • react-dom.development.js :提供 DOM 操作的 React 扩展库
  • babel.min.js :解析 JSX 语法(js语法糖),转换为 JS 代码
    <!-- 准备好一个“容器” -->
    <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>

    <!-- 此处一定要写babel,表示写的不是 JS,而是 JSX,并且靠 babel 翻译 -->
    <script type="text/babel">
      //1.创建虚拟DOM 此处是JSX 不要写引号,因为不是字符串
      const VDOM = <h1>Hello,React</h1>

      //2.渲染虚拟DOM到页面
      // 导入核心库和扩展库后,会有 React 和 ReactDOM 两个对象
      ReactDOM.render(VDOM, document.getElementById('test'))
    </script>

创建VDOM的两种方式

第一种 jsx方式(推荐).

    <div id="test"></div>
    
    <script type="text/javascript" src="../js/react.development.js"></script>
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <script type="text/babel">
      //1.创建虚拟DOM 
      const VDOM = (
        <h1>
            <span>Hello,React</span>
        </h1>
      )
      //2.渲染虚拟DOM到页面
      ReactDOM.render(VDOM, document.getElementById('test'))
    </script>

第二种原生js方式

    <div id="test"></div>

    <script type="text/javascript" src="../js/react.development.js"></script>
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
     //原生js不用写babel
    <script type="text/javascript">
      //1.创建虚拟DOM
      const VDOM = React.createElement('h1',{id:'title'},React.createElement('span',{},'Hello,React'))

      //2.渲染虚拟DOM到页面
      ReactDOM.render(VDOM, document.getElementById('test'))
    </script>

VDOM | DOM

关于虚拟 DOM:

  • 本质是 Object 类型的对象(一般对象)
  • 虚拟 DOM 比较“轻”,真实 DOM 比较“重”,因为虚拟 DOM 是 React 内部在用,无需真实 DOM 上那么多的属性。
  • 虚拟 DOM 最终会被 React 转化为真实 DOM,呈现在页面上。
    <script type="text/babel">
      //1.创建虚拟DOM 
      const VDOM = (
        <h1>
            <span>Hello,React</span>
        </h1>
      )
      //2.渲染虚拟DOM到页面
      ReactDOM.render(VDOM, document.getElementById('test'))

      console.log('VDOM',VDOM); // VDOM {...}是一个对象
      console.log('TDOM',document.querySelect('#test')); // TDOM <div>...</div>(真实DOM)
      console.log(typeof VDOM); // object
      console.log(VDOM instanceof Object); // true
    </script>

React JSX

  • 全称:JavaScript XML
  • React 定义的类似于 XML 的 JS 扩展语法;本质是 React.createElement() 方法的语法糖
  • 作用:简化创建虚拟 DOM
  • 补充:js中,JSON的序列化和反序列化使用parse()/stringify()

JSX 语法规则

  • 定义虚拟 DOM 时,不要写引号
  • 标签中混入 JS 表达式需要使用 {}
  • 指定类名不用 class,使用 className
  • 内联样式,使用 style={{ key: value }} 的形式
  • 只能有一个根标签
  • 标签必须闭合,单标签结尾必须添加 /:<input type="text" />
  • 标签首字母小写,则把标签转换为 HTML 对应的标签,若没有,则报错
  • 标签首字母大写,则渲染对应组件,若没有定义组件,则报错
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>jsx语法规则</title>
    <style>
      .title {
        background-color: orange;
        width: 200px;
      }
    </style>
  </head>
  <body>
    <div id="test"></div>
    ...
    <script type="text/babel">
      const myId = 'aTgUiGu'
      const myData = 'HeLlo,rEaCt'

      const VDOM = (
        <div>
          <h2 className="title" id={myId.toLowerCase()}>
            <span style={{ color: 'white', fontSize: '19px' }}>{myData.toLowerCase()}</span>
          </h2>
          <input type="text" />
          // <good>very good</good>
          // <Child></Child>
        </div>
      )

      ReactDOM.render(VDOM, document.getElementById('test'))
    </script>
  </body>
</html>

补充:表达式与语句(代码)的区别.

表达式:一个表达式会产生一个值,可以放在任何一个需要值的地方(如数值处理等)

   a
   a+b
   demo(1)
   arr.map() //可以遍历的时候使用
   function test () {}

语句(代码),下面这些都是语句(如逻辑判断语句)

  if(){}
  for(){}
  switch(){case:xxxx}

第二章:React面向组件

创建组件的两种方式

函数式组件

    <div id="app"></div>

    <script type="text/javascript" src="../js/react.development.js"></script>
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <script type="text/javascript" src="../js/babel.min.js"></script>
    
    <script type="text/babel">
        // 创建函数式组件
        function Demo() {
            console.log(this) //babel编译后开启严格模式 此处的this是undefind
            return <h1>函数式组件,适用于简单组件的创建</h1>
        }
        // 挂载组件
        ReactDOM.render(<Demo/>,document.querySelector("#app"))
    </script>

要点:

  • 组件名称首字母必须大写,否则会解析成普通标签导致报错(JSX 语法规则)
  • 函数需返回一个虚拟 DOM
  • 渲染组件时需要使用标签形式,同时标签必须闭合

渲染组件的过程:

1、React 解析标签,寻找对应组件
2、发现组件是函数式组件,则调用函数,将返回的虚拟 DOM 转换为真实 DOM ,并渲染到页面中

类式组件

类的基本知识

    <script type="text/javascript">
        /*
            总结:
            1. 类的实例不是必须写的,需要对类进行初始化操作,如添加指定属性时才写
            2. 子类继承父类,子类中写了构造器,那么子类构造器中的super是必须要调用的
            3. 类中定义的方法都是放在了类的原型对象上,供实例去使用
            4. 实例调用子类的方法时,找不到会去父类的原型对象上去找,一直找到顶级window对象
        */
        class Person {
            // 构造器方法
            constructor(name,age) {
                // 构造器中的this指向类的实例对象(constructor是一个函数,由实例对象调用,所以this指向实例对象)
                this.name = name
                this.age = age
            }
            // 一般方法
            speak() {
                // 放在了类的原型对象上,供实例使用
                // 通过Person实例调用speak方法时,speak中的this指向Person实例
                console.log(`我的名字叫${this.name},今年${this.age}岁了`);
            }
        }
        // Student类继承与Person类
        class Student extends Person {
            constructor(name,age,id) {
                super(name,age)
                this.id = id
            }
            // 重写从父类继承的方法
            speak() {
                console.log(`我的名字叫${this.name},今年${this.age}岁了,编号为${this.id}`);
            }
        }
        const p1 = new Person('张三',18)
        p1.speak()
        const s1 = new Student('李四',16,'30461')
        s1.speak()
    </script>

组件渲染过程:

  • React 解析组件标签,寻找组件
  • 发现是类式组件,则 new 该类的实例对象,通过实例调用原型上的 render 方法
  • 将 render 返回的虚拟 DOM 转为真实 DOM ,渲染到页面上
//创建类式组件
class MyComponent extends React.Component {
	render() {
		return <h2>我是用类定义的组件</h2>
		}
	}
//渲染组件到页面
ReactDOM.render(<MyComponent/>,document.getElementById('test'))

第三章: 组件实例的核心属性

核心属性1:state | 状态

state 是组件实例对象最重要的属性,值为对象。又称为状态机,通过更新组件的 state 来更新对应的页面显示。

要点:

  • 初始化 state
  • React 中事件绑定
  • this 指向问题
  • setState 修改 state 状态
  • constructor 、render 、自定义方法的调用次数

标准写法:

    <script type="text/babel">
        class Weather extends React.Component {
        //构造器调用1次
            constructor(props) {
                super(props) 
                // 初始化状态
                this.state = {isHot:true}
                // 解决changeWeather中的this指向问题
                this.change = this.changeWeather.bind(this)
                
            }
            render() {
            //render调用n+1次
                // 读取状态
                const {isHot} = this.state 
                // 这里的this指向原型对象
                // return <h1 onClick={this.changeWeather}>今天天气{isHot?'凉爽':'炎热'}</h1>

                // 这里的this指向实例自身
                return <h1 onClick={this.change}>今天天气{isHot ? '炎热' :'凉爽' }</h1>
            }
            changeWeather() {
            //点几次changeWeather调用几次
                // changeWeather放在实例对象的原型上,供实例使用
                // changeWeather作为onClick的回调函数使用,不是通过实例调用,是直接调用
                // 类中的方法默认开启了严格模式,this指向丢失

                // 状态不可直接更改,必须借助React内置API
                // this.state.isHot = !this.state.isHot
                this.setState({isHot:!this.state.isHot})
            }
        }

        function demo() {
            // 修改状态
        }
        ReactDOM.render(<Weather/>,document.querySelector('#app'))
    </script>

简写:

    <script type="text/babel">
        // 创建组件
        class Weather extends React.Component {
            // 初始化状态
            state = {isHot:true}

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

            // 自定义方法 -- 赋值语句+箭头函数(中的this指向上下文中的this)
            changeWeather = ()=>{
                this.setState({isHot:!this.state.isHot})
            }
        }
        ReactDOM.render(<Weather/>,document.querySelector('#app'))
    </script>

核心属性2:props | 标签属性

每个组件对象都有 props 属性,组件标签的属性都保存在 props 中。(注意:props 是只读的,不能修改。)

标准写法:

    <script type="text/babel">
        // 创建组件
        class Person extends React.Component {
            render() {
                const {name,age,sex} = this.props
                return (
                    <div>
                        <h1>{name}</h1>
                        <h2>{age}</h2>
                        <h2>{sex}</h2>
                    </div>
                )
            }
        }
        // 渲染组件
        // ReactDOM.render(<Person name="张三" age="18" sex="1"/>,document.querySelector('#app'))
        // 批量传递props/批量传递标签属性
        const obj = {name:"张三",age:18,sex:"男"}
        ReactDOM.render(<Person {...obj}/>,document.querySelector('#app'))
    </script>
  • 限制标签属性 在 React 15.5 以前,React 身上有一个 PropTypes 属性可直接使用,即 name:React.PropTypes.string.isRequired ,没有把 PropTypes 单独封装为一个模块。
    <div id="app1"></div>
    <div id="app2"></div>
    <div id="app3"></div>

    <script type="text/javascript" src="../js/react.development.js"></script>
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <script type="text/javascript" src="../js/babel.min.js"></script>
    <!-- 引入prop-type 用于限制props属性标签 -->
    <script type="text/javascript" src="../js/prop-types.js"></script>
    
    <script type="text/babel">
        // 假数据
        const obj = {name:"张三",age:18,sex:"男"}
        // 创建组件
        class Person extends React.Component {
            render() {
                const {name,age,sex} = this.props
                return (
                    <div>
                        <span>{name}</span>
                        <span>{age}</span>
                        <span>{sex}</span>
                    </div>
                )
            }
        }
        // 对标签属性进行限制
        Person.propTypes = {
            name:PropTypes.string.isRequired,//限制name必传且为String类型
            age:PropTypes.number,//限制age为number类型
            sex:PropTypes.string,//限制sex为String类型
            speak:PropTypes.func//限制speak为函数类型
        }
        Person.defaultProps = {
            age:18,//指定age默认值
            sex:'保密'//指定sex默认值
        }

        function speak() {
            console.log('hello');
        }
        // 渲染组件
        ReactDOM.render(<Person name="李四" age={20} sex="男" speak={speak}/>,document.querySelector('#app1'))
        ReactDOM.render(<Person name="李五"/>,document.querySelector('#app3'))
        // 批量传递props/批量传递标签属性
        ReactDOM.render(<Person {...obj}/>,document.querySelector('#app2'))
    </script>

函数式组件使用props:

    <script type="text/babel">
        // 假数据
        const obj = {name:"张三",age:18,sex:"男"}
        // 创建组件
        function Person(props) {
            const {name,age,sex} = props
            return (
                <div>
                    <h1>{name}</h1>
                    <h2>{age}</h2>
                    <h2>{sex}</h2>
                </div>
            )
        }
        // 对标签属性进行限制
        Person.propTypes = {
            name:PropTypes.string.isRequired,//限制name必传且为String类型
            age:PropTypes.number,//限制age为number类型
            sex:PropTypes.string,//限制sex为String类型
            speak:PropTypes.func//限制speak为函数类型
        }
        Person.defaultProps = {
            age:18,//指定age默认值
            sex:'保密'//指定sex默认值
        }

        ReactDOM.render(<Person {...obj}/>,document.querySelector('#app2'))
    </script>

简写形式:

    <!-- 引入prop-type 用于限制props属性标签 -->
    <script type="text/javascript" src="../js/prop-types.js"></script>
    
    <script type="text/babel">
        // 假数据
        const obj = {name:"张三",age:18,sex:"男"}
        // 创建组件
        class Person extends React.Component {
            render() {
                const {name,age,sex} = this.props
                return (
                    <div>
                        <span>{name}</span>
                        <span>{age}</span>
                        <span>{sex}</span>
                    </div>
                )
            }
            // 对标签属性进行限制
            static propTypes = {
                name:PropTypes.string.isRequired,//限制name必传且为String类型
                age:PropTypes.number,//限制age为number类型
                sex:PropTypes.string,//限制sex为String类型
                speak:PropTypes.func//限制speak为函数类型
            }
            static defaultProps = {
                age:18,//指定age默认值
                sex:'保密'//指定sex默认值
            }
        }
        

        function speak() {
            console.log('hello');
        }
        // 渲染组件
        ReactDOM.render(<Person name="李四" age={20} sex="男" speak={speak}/>,document.querySelector('#app1'))
        ReactDOM.render(<Person name="李五"/>,document.querySelector('#app3'))
        // 批量传递props/批量传递标签属性
        ReactDOM.render(<Person {...obj}/>,document.querySelector('#app2'))
    </script>

核心属性3:refs | 标识符

通过定义 ref 属性可以给标签添加标识。

1、字符串形式的ref(这种形式已过时,效率不高,官方不建议使用。)

<script type="text/babel">
        class Demo extends React.Component {
            showData = ()=>{
                const {input1,innput2} = this.refs
                console.log(input1);
            }
            render() {
                return (
                    <div>
                        <input ref="input1" type="text"/>
                        <br/>
                        <br/>
                        <button onClick={this.showData}>点击确认文字</button>
                        <input ref="input2" type="text"/>
                    </div>
                )
            }
        }

        ReactDOM.render(<Demo/>,document.querySelector('#app'))
    </script>

2、回调函数形式的ref(便捷 使用最多
要点:

  • currentNode => this.input1 = currentNode 就是给组件实例添加 input1 属性,值为节点
  • 由于是箭头函数,因此 this 是 render 函数里的 this ,即组件实例
  • 回调ref中调用次数问题:原文(如果 ref 回调函数是以内联函数的方式定义的,在更新过程中它会被执行两次,第一次传入参数null,然后第二次会传入参数 DOM 元素。见官方文档)
    <script type="text/babel">
        class Demo extends React.Component {
            showData = ()=>{
                const {input1,input2} = this
                console.log(input1);
            }
            render() {
                return (
                    <div>
                        <input ref={(currentNode) => {this.input1=currentNode}} type="text"/>
                        <br/>
                        <br/>
                        <button onClick={this.showData}>点击确认文字</button>
                        <input ref="input2" type="text"/>
                    </div>
                )
            }
        }

        ReactDOM.render(<Demo/>,document.querySelector('#app'))
    </script>

3、createRef API(官方推荐使用) 该方式通过调用 React.createRef 返回一个容器(对象)用于存储节点,且一个容器只能存储一个节点。

    <script type="text/babel">
        class Demo extends React.Component {
            myRef = React.createRef()
            myRef2 = React.createRef()
            showData = ()=>{
                console.log(this.myRef);//{current: input}
                alert(this.myRef.current.value)
            }
            render() {
                return (
                    <div>
                        <input ref={this.myRef} type="text"/>
                        <input ref={this.myRef2} type="text"/>//测试的,没加事件
                        <br/>
                        <br/>
                        <button onClick={this.showData}>点击确认文字</button>
                    </div>
                )
            }
        }

        ReactDOM.render(<Demo/>,document.querySelector('#app'))
    </script>

事件处理

  • React 使用自定义事件,而非原生 DOM 事件,即 onClick、onBlur :为了更好的兼容性
  • React 的事件通过事件委托方式进行处理:为了高效
  • 通过 event.target 可获取触发事件的 DOM 元素:勿过度使用 ref 当触发事件的元素和需要操作的元素为同一个时,可以不使用ref :
class Demo extends React.Component {
  showData2 = (event) => {
    alert(event.target.value)
  }

  render() {
    return (
      <div>
        <input onBlur={this.showData2} type="text" placeholder="失去焦点提示数据" />
        &nbsp;
      </div>
    )
  }
}

受控组件&非受控组件

非受控组件:现用现取。即需要使用时,再获取节点得到数据 受控组件:类似于 Vue 双向绑定的从视图层绑定到数据层(推荐使用,因为非受控组件需要使用大量的 ref 。)

    <script type="text/babel">
        class Demo extends React.Component {
            handleSubmit = (event) => {
                event.preventDefault() //阻止表单默认提交
                const {username,password} = this
                alert(`${username.value},${password.value}`)
            }
            render() {
                return (
                    <form action="" onSubmit={this.handleSubmit}>
                        用户名:<input ref={c => this.username = c} type="text"/>
                        密码:  <input ref={c => this.password = c} type="password"/>
                        <button>登录</button>
                    </form>
                )
            }
            
        }
        
        ReactDOM.render(<Demo/>,document.querySelector('#app'))
    </script>

受控组件

<script type="text/babel">
        class Demo extends React.Component {
            state = {
                username:'1',
                password:'2'
            }
            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="" onSubmit={this.handleSubmit}>
                        用户名:<input onChange = {this.saveUsername} type="text"/>
                        密码:  <input onChange = {this.savePassword} type="password"/>
                        <button>登录</button>
                    </form>
                )
            }
            
        }
        
        ReactDOM.render(<Demo/>,document.querySelector('#app'))
    </script>

补充:高阶函数&函数柯里化

**高阶函数:**参数为函数或者返回一个函数的函数,常见的如 Promise、setTimeout、Array.map()等
函数柯里化:通过函数调用继续返回函数的方式,实现多次接收参数最后统一处理的函数编码形式 使用高阶函数简化受控组件

    <script type="text/babel">
        class Demo extends React.Component {
            // 初始化state
            state = {
                username:'1',
                password:'2'
            }

            // 自定义事件
            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="" onSubmit={this.handleSubmit}>
                        用户名:<input onChange = {this.saveFormData('username')} type="text"/>
                        密码:  <input onChange = {this.saveFormData('password')} type="password"/>
                        <button>登录</button>
                    </form>
                )
            }
            
        }

        // 渲染组件
        ReactDOM.render(<Demo/>,document.querySelector('#app'))
    </script>

第四章: 生命周期(新)

在这里插入图片描述

1、初始化阶段

ReactDOM.render()触发 —— 初次渲染

  • constructor() —— 类组件中的构造函数
  • static getDerivedStateFromProps(props, state) 从props得到一个派生的状态【新增】,即state的值在任何时候都取决于props
  • render() —— 挂载组件
  • componentDidMount() —— 组件挂载完成 比较常用

2、更新阶段

由组件内部this.setSate()或父组件重新render触发或强制更新forceUpdate()

  • getDerivedStateFromProps() —— 从props得到一个派生的状态 【新增】
  • shouldComponentUpdate() —— 组件是否应该被更新(默认返回true)
  • render() —— 挂载组件
  • getSnapshotBeforeUpdate() —— 在更新之前获取快照【新增】,就是捕捉更新前的状态
  • componentDidUpdate(prevProps, prevState, snapshotValue) —— 组件完成更新

3、卸载组件

ReactDOM.unmountComponentAtNode()触发

  • componentWillUnmount() —— 组件即将卸载
**    <script type="text/babel">
        class Demo extends React.Component {
            state = {newsArr:[]}

            componentDidMount() {
                setInterval(() => {
                    // 获取状态
                    let {newsArr} = this.state
                    const news = '列表'+(newsArr.length+1)
                    // 更新状态
                    this.setState({newsArr:[news,...newsArr]})
                }, 1000);
            }
            getSnapshotBeforeUpdate() {
                return this.refs.list.scrollHeight
            }
            componentDidUpdate(preProps,preState,height) {
                this.refs.list.scrollTop += this.refs.list.scrollHeight - height
            }
            render() {
                return (
                    <div>
                        <ul className="list" ref="list">
                            {
                                this.state.newsArr.map((n,index) => {
                                    return <li key={index} className="news">{n}</li>
                                })
                            } 
                        </ul>
                    </div>
                )
            }
        }
        ReactDOM.render(<Demo/>,document.querySelector("#app"))
        
    </script>**

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI 前沿发展摘要

&#x1f514; AI 前沿发展摘要 1⃣️ ChatScene: 一句话生成自动驾驶关键场景 主要功能: Chat Scene 能够在CARLA仿真环境中创建多样化和复杂的场景, 有效地弥合了交通场景文本描述和CARLA实际仿真之间的鸿沟 效果: 通过使用生成的安全关键场景来微调不同的基于RL的自动驾…

MGR集群模拟故障切换

说明&#xff1a; 1、MGR集群搭建起来&#xff0c;但不知道是否能进行启动切换&#xff0c;故要手动模拟故障并且验证 2、停止主库master服务&#xff0c;登录mysql查看MGR是否进行自动切换。 3、主库切换完成以后&#xff0c;手动将宕机的服务器添加到MGR集群中。 一、模拟故障…

js知识点之闭包

闭包 什么是闭包 闭包&#xff0c;是 JavaScript 中一个非常重要的知识点&#xff0c;也是我们前端面试中较高几率被问到的知识点之一。 打开《JavaScript 高级程序设计》和《 JavaScript 权威指南》&#xff0c;会发现里面针对闭包的解释各执一词&#xff0c;在网络上搜索关…

【PMP必考点】2024年PMP敏捷知识必考点-工件篇

PMP自2023年8月起启动了PMBOK第七版教材&#xff0c;考试内容的侧重点也发生了改变&#xff1a;大幅增加了敏捷相关的内容。以往考纲只有不到10%的敏捷管理的内容&#xff0c;新考纲的敏捷管理题目增加至50%。所以如果复习只用之前的题目是远远不够的&#xff0c;必须要多刷新考…

2024年西安交通大学程序设计校赛

A题 签到题 代码如下 //A #include<iostream> #include<algorithm> #define int long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); using namespace std; signed main() {IOSint a,b,c,d;cin>>a>>b>>c…

使用C语言openssl库实现 RSA加密 和 消息验证

Q&#xff1a;什么是RSA&#xff1f; A&#xff1a;RSA&#xff08;Rivest-Shamir-Adleman&#xff09;是一种非对称加密算法&#xff0c;是最早的一种用于公开密钥加密和数字签名的算法。它使用一对公钥&#xff08;public key&#xff09;和私钥&#xff08;private key&…

Gartner发布2024年数据与分析重要趋势

Gartner公司发布了2024年数据与分析&#xff08;D&A&#xff09;重要趋势&#xff0c;这些趋势正在带来包括组织、人事问题在内的各种挑战。 Gartner高级研究总监方琦表示&#xff1a;“AI的力量以及日益重要的生成式AI正在改变人们的工作方式、团队协作方式和流程运作方式…

每天学点小知识:Windows终端Powershell美化

前言 本章的旨在教会你美化自己的终端&#xff0c;powershell需要以管理员运行 经过我的测试&#xff0c;不同的电脑可能会有不同的报错&#xff0c;具体操作根据官方为主https://ohmyposh.dev/docs 效果展示 Oh My Posh&#xff1a;提供美观的 PowerShell 提示符主题 1.安装…

LWIP_TCP 协议

目录 1 TCP 协议简介 1.1 TCP 协议简介 1.2 TCP 的建立连接 1.3 TCP 终止连接 1.4 TCP 报文结构 1.5 lwIP 的 TCP 报文首部数据结构 1.6 lwIP 的 TCP 连接状态图 1 TCP 协议简介 1.1 TCP 协议简介 TCP&#xff08;Transmission Control Protocol 传输控制协议&#xff0…

鸿蒙时间滑动选择器弹窗

例子&#xff1a; Button(打开弹窗).fontSize(14).width(106).height(32).padding({ left: 0, right: 0 }).fontColor(#999).onClick(()>{DatePickerDialog.show({selected:new Date(),onDateAccept:(value)>{AlertDialog.show({ message:JSON.stringify(value) })}})}) …

【豆伴匠】L1-L12更新完,一站式解决文史积累、阅读、写作难题,弯道超车,寒假必备

合抱之木&#xff0c;生于毫末&#xff1b; 九层之台&#xff0c;起于垒土&#xff1b; 千里之行&#xff0c;始于足下。 豆伴匠是什么&#xff1f; 豆伴匠内容包括&#xff1a;人、文、史、作四个模块&#xff0c;全面覆盖文史知识及读写技巧。 目前&#xff0c;豆伴匠有L…

[猫头虎分享21天微信小程序基础入门教程]第21天:小程序的社交分享与消息推送

[猫头虎分享21天微信小程序基础入门教程]第21天&#xff1a;小程序的社交分享与消息推送 第21天&#xff1a;小程序的社交分享与消息推送 &#x1f4f2; 自我介绍 大家好&#xff0c;我是猫头虎&#xff0c;一名全栈软件工程师。今天我们继续微信小程序的学习&#xff0c;重…

论文《Visual Point Cloud Forecasting enables Scalable Autonomous Driving》详细解析

论文《Visual Point Cloud Forecasting enables Scalable Autonomous Driving》详细解析 摘要 该论文提出了一种新的预训练任务&#xff0c;称为“视觉点云预测”&#xff08;Visual Point Cloud Forecasting&#xff09;&#xff0c;从历史视觉输入中预测未来的点云。论文介…

大模型部署推理应用技术浅析

大模型完成预训练后不是就万事大吉了&#xff0c;离推理应用还有很大距离&#xff0c;需要经过微调、部署等一系列工程化工作。尤其是在2B的行业大模型应用中&#xff0c;为解决大模型的幻觉、时效性和推理成本问题&#xff0c;需要建立单一模型之上的体系。模型部署中的技术大…

CyberLink ColorDirector Ultra v12 解锁版安装教程 (视频后期调色软件)

前言 CyberLink ColorDirector Ultra 是一款视频后期调色处理软件&#xff0c;可以给视频进行专业色彩调整&#xff0c;让视频看起来焕然一新。它支持的格式视频非常多&#xff0c;流行的格式全都可以添加到里面进行调色处理&#xff0c;主要是使用关键帧控件进行颜色替换&…

Mac在docker可视化界面上安装主流数据库

前言 篇幅有点长&#xff0c;大家可以打开目录快速跳转到想要的数据库即可&#xff01; 虽然说用命令行会显得我们更加专业一些&#xff0c;但对于我英语水平不怎么好的人来说&#xff0c;毕竟命令多又长&#xff0c;还不好记。我个人是喜欢复杂问题简单化&#xff0c;踩了很多…

Balabolka-一款完全免费的电子书朗读及文本转语音软件

下载地址&#xff1a;Balabolka Balabolka能够进行简单的文本转语音任务&#xff0c;支持各种语言包&#xff0c;该软件可以读取剪贴板的内容&#xff0c; 可以查看AZW&#xff0c;CHM&#xff0c;DjVu&#xff0c;DOC&#xff0c;EPUB&#xff0c;FB2&#xff0c;LIT&#xff…

想知道股指期货和期权有什么不同吗?

市场上目前有中金所的沪深300ETF&#xff0c;中证500和中证1000股指期货&#xff0c;期权市场有上证50ETF&#xff0c;沪深300etf和中证500ETF期权&#xff0c;股指期货和期权在买卖双方的权利义务、风险收益特征、保证金制度、上市合约数量等方面均有较大区别&#xff0c;下文…

操作系统真象还原:一些你可能正感到迷惑的问题

第0章-一些你可能正感到迷惑的问题 这是我看操作系统真象还原这本书的一些记录&#xff1a; 4 软件是如何访问硬件的 硬件在输入输出上大体分为串行和并行&#xff0c;相应的接口也就是串行接口和并行接口。串行硬件通过串行接口与 CPU 通信&#xff0c;反过来也是&#xff…

连锁收银系统支持带结算功能

连锁实体店的收银系统需要支持结算功能&#xff0c;以适应连锁运营效率和提升连锁管理的水平。商淘云连锁收银系统与您一起分享连锁收银系统需支持结算功能的三大必要点。大家点赞收藏&#xff0c;以免划走后找不到了。 一是&#xff0c;连锁模式的运营比较复杂&#xff0c;有加…