React进阶之路(一)-- JSX基础、组件基础

news2024/11/6 7:21:24

文章目录

  • React介绍
  • React开发环境搭建
    • 项目目录说明以及相关调整
  • JSX基础
    • JSX介绍
    • JSX中使用js表达式
    • JSX列表渲染
    • JSX条件渲染
    • JSX样式处理
    • JSX注意事项
  • 组件基础
    • 组件的概念
    • 函数组件
    • 类组件
    • 事件绑定
      • 如何绑定事件
      • 获取事件对象
      • 传递额外参数
    • 组件状态
    • 状态不可变
    • 表单处理
      • 受控表单组件
      • 非受控表单组件
  • 阶段性实践项目

参考课程地址:
React入门到实战

React介绍

在这里插入图片描述

React是什么?

React是一个用于构建用户界面的JavaScript库,它主要用于构建UI,很多人认为React是MVC中的V(视图)。React起源于Facebook的内部项目,用来架设Instagram的网站,并于2013年5月开源。React拥有较高的性能,代码逻辑非常简单,越来越多的人已开始关注和使用它。

React有什么特点

  • 声明式UI(JSX):写UI就和写普通的HTML一样,抛弃命令式的繁琐实现
    在这里插入图片描述
  • 组件化:组件是react中最重要的内容,组件可以通过搭积木的方式拼成一个完整的页面,通过组件的抽象可以增加复用能力和提高可维护性
    在这里插入图片描述
  • 跨平台:react既可以开发web应用也可以使用同样的语法开发原生应用(react-native),比如安卓和ios应用,甚至可以使用react开发VR应用,想象力空间十足,react更像是一个 元框架 为各种领域赋能
  • 高效:React通过对DOM的模拟,最大限度地减少与DOM的交互,提高渲染效率。
  • 单向数据流:React实现了单向数据流,即数据只能从父组件传递到子组件,而不能反向传递,这样可以避免数据的混乱和冲突,也方便数据的管理和追踪。

React开发环境搭建

现在的前端开发环境已经趋于工程化,我们一般使用脚手架来创建一个项目的初始环境

那么什么是脚手架呢?

在这里插入图片描述

在这里我们使用的脚手架就是create react app:
在这里插入图片描述

$ npx create-react-app react-basic

说明:

  • npx create-react-app 是固定命令,create-react-app是React脚手架的名称
  • react-basic表示项目名称,可以自定义,保持语义化
  • npx 命令会帮助我们临时安装create-react-app包,然后初始化项目完成之后会自自动删掉,所以不需要全局安装create-react-app

启动项目:

$ yarn start
or
$ npm start

什么是npx,他和npm有什么区别?
在这里插入图片描述
在这里插入图片描述

项目目录说明以及相关调整

  • 目录说明
    • src 目录是我们写代码进行项目开发的目录
    • package.json 中俩个核心库:react 、react-dom
  • 目录调整
    • 删除src目录下自带的所有文件,只保留app.js根组件和index.js
    • 创建index.js文件作为项目的入口文件,在这个文件中书写react代码即可

入口文件index.js说明:

//react框架的核心包
import React from 'react'
//专门做渲染方面的包
import ReactDOM from 'react-dom'
//应用的全局样式文件
import './index.css'
// 引入根组件App
import App from './App'

// 通过调用ReactDOM的render方法渲染App根组件到id为root的dom节点上
ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById('root')
)

//如果是react18版本
//注意把严格模式去掉,否则会影响useEffect的执行时间
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
    <App />
);

在这里插入图片描述
这个index.css里面一般是做一些全局样式的初始化:
在这里插入图片描述

JSX基础

在这里插入图片描述

JSX介绍

概念:JSX是 JavaScript XML(HTML)的缩写,表示在 JS 代码中书写 HTML 结构

作用:在React中创建HTML结构(页面UI结构)

优势:

  1. 采用类似于HTML的语法,降低学习成本,会HTML就会JSX
  2. 充分利用JS自身的可编程能力创建HTML结构

注意:JSX 并不是标准的 JS 语法,是 JS 的语法扩展,浏览器默认是不识别的,脚手架中内置的 @babel/plugin-transform-react-jsx 包,用来解析该语法

接比如下面的图片,我们写的是左边,其实编译的时候变成了右边:
在这里插入图片描述

JSX中使用js表达式

语法

const name = '柴柴'

<h1>你好,我叫{name}</h1>   //    <h1>你好,我叫柴柴</h1>

可以使用的表达式

  1. 字符串、数值、布尔值、null、undefined、object( [] / {} )
  2. 1 + 2、‘abc’.split(‘’)、[‘a’, ‘b’].join(‘-’)
  3. fn()

特别注意

if 语句/ switch-case 语句/ 变量声明语句,这些叫做语句,不是表达式,不能出现在 {} 中!!
技巧:能够通过console.log打印出来的就是表达式

JSX列表渲染

页面的构建离不开重复的列表结构,比如歌曲列表,商品列表等,我们知道vue中用的是v-for,react这边如何实现呢?

实现:使用数组的map 方法

// 来个列表
const songs = [
  { id: 1, name: '痴心绝对' },
  { id: 2, name: '像我这样的人' },
  { id: 3, name: '南山南' }
]

function App() {
  return (
    <div className="App">
      <ul>
        {
          songs.map(item => <li>{item.name}</li>)
        }
      </ul>
    </div>
  )
}

export default App

注意点:需要为遍历项添加 key 属性,提高diff性能
在这里插入图片描述

  1. key 在 HTML 结构中是看不到的,是 React 内部用来进行性能优化时使用
  2. key 在当前列表中要唯一的字符串或者数值(String/Number)
  3. 如果列表中有像 id 这种的唯一值,就用 id 来作为 key 值
  4. 如果列表中没有像 id 这种的唯一值,就可以使用 index(下标)来作为 key 值

JSX条件渲染

作用:根据是否满足条件生成HTML结构,比如Loading效果
实现:可以使用 三元运算符逻辑与(&&)运算符

// 来个布尔值
const flag = true
function App() {
  return (
    <div className="App">
      {/* 条件渲染字符串 */}
      {flag ? 'react真有趣' : 'vue真有趣'}
      {/* 条件渲染标签/组件 */}
      {flag ? <span>this is span</span> : null}
    </div>
  )
}
export default App

如果是复杂的条件渲染,我们可以把整个逻辑封装成一个函数,然后直接在{}中执行函数即可。

例如:

在这里插入图片描述

JSX样式处理

行内样式

function App() {
  return (
    <div className="App">
      <div style={{ color: 'red' }}>this is a div</div>
    </div>
  )
}

export default App

行内样式优化版

const styleObj = {
    color:red
}

function App() {
  return (
    <div className="App">
      <div style={ styleObj }>this is a div</div>
    </div>
  )
}

export default App

类名方式

.title {
  font-size: 30px;
  color: blue;
}
function App() {
  return (
    <div className="App">
      <div className='title'>this is a div</div>
    </div>
  )
}

export default App

动态类名

import './app.css'
const showTitle = true
function App() {
  return (
    <div className="App">
      <div className={ showTitle ? 'title' : ''}>this is a div</div>
    </div>
  )
}
export default App

JSX注意事项

  1. JSX必须有一个根节点,如果没有根节点,可以使用<></>(幽灵节点)替代
  2. 所有标签必须形成闭合,成对闭合或者自闭合都可以
  3. JSX中的语法更加贴近JS语法,属性名采用驼峰命名法
    • class -> className
    • for -> htmlFor
  4. JSX支持多行(换行),如果需要换行,需使用() 包裹,防止bug出现

组件基础

在这里插入图片描述

组件的概念

React的组件概念是指将UI界面拆分成可复用的代码片段,每个片段都是一个独立的模块,可以有自己的状态和逻辑,也可以接收外部传入的数据和事件。React的组件可以用函数或类的形式来定义,也可以用JSX语法来描述组件的结构和样式。React的组件可以嵌套和组合,形成复杂的应用界面。React的组件的优点是可以提高开发效率和代码质量,也可以保证UI和数据的一致性。

在这里插入图片描述

函数组件

使用 JS 的函数(或箭头函数)创建的组件,就叫做函数组件

接下来我们来看一个函数组件的定义和渲染的例子:

// 定义函数组件
function HelloFn () {
  return <div>这是我的第一个函数组件!</div>
}

// 定义类组件
function App () {
  return (
    <div className="App">
      {/* 渲染函数组件 */}
      <HelloFn />
      <HelloFn></HelloFn>
    </div>
  )
}
export default App

约定说明

  1. 组件的名称必须首字母大写,react内部会根据这个来判断是组件还是普通的HTML标签
  2. 函数组件必须有返回值,表示该组件的 UI 结构;如果不需要渲染任何内容,则返回 null
  3. 组件就像 HTML 标签一样可以被渲染到页面中。组件表示的是一段结构内容,对于函数组件来说,渲染的内容是函数的返回值就是对应的内容
  4. 使用函数名称作为组件标签名称,可以成对出现也可以自闭合

类组件

使用 ES6 的 class 创建的组件,叫做类(class)组件

// 引入React
import React from 'react'

// 定义类组件
class HelloC extends React.Component {
  render () {
    return <div>这是我的第一个类组件!</div>
  }
}

function App () {
  return (
    <div className="App">
      {/* 渲染类组件 */}
      <HelloC />
      <HelloC></HelloC>
    </div>
  )
}
export default App

约定说明

  1. 类名称也必须以大写字母开头
  2. 类组件应该继承 React.Component 父类,从而使用父类中提供的方法或属性
  3. 类组件必须提供 render 方法,render 方法必须有返回值,表示该组件的 UI 结构

事件绑定

如何绑定事件

  • 语法
    on + 事件名称 = { 事件处理程序 } ,比如:<div onClick={ onClick }></div>
  • 注意点
    react事件采用驼峰命名法,比如:onMouseEnter、onFocus

在函数组件中:

// 函数组件
function HelloFn () {
  // 定义事件回调函数
  const clickHandler = () => {
    console.log('事件被触发了')
  }
  return (
    // 绑定事件
    <button onClick={clickHandler}>click me!</button>
  )
}

类组件中的事件绑定,整体的方式和函数组件差别不大,唯一需要注意的是:因为处于class类语境下,所以定义事件回调函数以及写法上有不同

  1. 定义的时候: class Fields语法
  2. 使用的时候: 需要借助this关键词获取
import React from "react"

class CComponent extends React.Component {
  // class Fields
  clickHandler = (e, num) => {
    // 这里的this指向的是正确的当前的组件实例对象 
    // 可以非常方便的通过this关键词拿到组件实例身上的其他属性或者方法
    console.log(this)
  }

  clickHandler1 () {
    // 这里的this 不指向当前的组件实例对象而指向undefined 存在this丢失问题
    console.log(this)
  }

  render () {
    return (
      <div>
        <button onClick={(e) => this.clickHandler(e, '123')}>click me</button>
        <button onClick={this.clickHandler1}>click me</button>
      </div>
    )
  }
}

function App () {
  return (
    <div>
      <CComponent />
    </div>
  )
}

export default App

为什么这里会出现this指向不明的问题?

在这里插入图片描述
在这里插入图片描述

当然现在的主流写法都是函数组件,无需过多考虑this的指向问题。

获取事件对象

事件对象是一个用来记录事件发生时的相关信息的对象,它可以用来解决一些事件处理的问题,比如:

  • 获取事件的类型、目标、阶段、时间等基本信息,用于判断事件的性质和来源。
  • 获取事件的坐标、按键、按钮等细节信息,用于实现一些交互效果,比如拖拽、缩放、滚动等。
  • 阻止事件的默认行为或冒泡传播,用于避免一些不期望的结果,比如链接跳转、表单提交、事件重复触发等。
  • 传递一些自定义的数据或参数,用于实现一些特定的功能,比如传递状态、标识、回调函数等。

事件对象的属性和方法可能因为不同的浏览器或事件类型而有所差异,所以在使用事件对象时,需要注意兼容性和适用性的问题。

获取事件对象e只需要在 事件的回调函数中 补充一个形参e即可拿到

// 函数组件
function HelloFn () {
  // 定义事件回调函数
  const clickHandler = (e) => {
    console.log('事件被触发了', e)
  }
  return (
    // 绑定事件
    <button onClick={clickHandler}>click me!</button>
  )
}

传递额外参数

解决思路: 改造事件绑定为箭头函数,在箭头函数中完成参数的传递


import React from "react"

// 如何获取额外的参数?
// onClick={ onDel } -> onClick={ () => onDel(id) }
// 注意: 一定不要在模板中写出函数调用的代码 onClick = { onDel(id) }  bad!!!!!!

const TestComponent = () => {
  const list = [
    {
      id: 1001,
      name: 'react'
    },
    {
      id: 1002,
      name: 'vue'
    }
  ]
  const onDel = (e, id) => {
    console.log(e, id)
  }
  return (
      <ul>
        {list.map(item =><li key={item.id}>
                {item.name}
                <button onClick={(e) => onDel(e, item.id)}>x</button>
           </li>
        ))}
      </ul>
  )
}

function App () {
  return (
    <div>
      <TestComponent />
    </div>
  )
}


export default App

很多人这个地方都是自己硬背,什么如果只传事件参数,那就直接写回调参函数名,如果还要传递额外参数,那就要用箭头函数包一下。其实完全没必要,只要理解了就都说通了,这个地方我们怎么去理解?
我们要知道:我们不需要主动去调用事件处理函数,我们只是把事件处理函数交出去,换句话说我们只需要写一个声明语法,而不是调用语法,当事件被触发的时候会有监听器或者计时器去调用。

组件状态

一个前提:在React hook出来之前,函数式组件是没有自己的状态的,所以我们统一通过类组件来讲解

在这里插入图片描述

初始化状态

  • 通过class的实例属性state来初始化(必须是state属性)
  • state的值是一个对象结构,表示一个组件可以有多个数据状态
class Counter extends React.Component {
  // 初始化状态
  state = {
    count: 0
  }
  render() {
    return <button>计数器</button>
  }
}

读取状态

class Counter extends React.Component {
  // 初始化状态
  state = {
    count: 0
  }
  render() {
    // 读取状态
    return <button>计数器{this.state.count}</button>
  }
}

修改状态

  • 语法
    • this.setState({ 要修改的部分数据 })
  • setState方法作用
    • 修改state中的数据状态
    • 更新UI
  • 思想
    • 数据驱动视图,也就是只要修改数据状态,那么页面就会自动刷新,无需手动操作dom
  • 注意事项
    • 不要直接修改state中的值,必须通过setState方法进行修改

这里其实就是MVVM思想的体现,vue也是这个原理,其核心特点就是双向绑定,也就是说:当view变化的时候,数据也会改变。当数据发生变化的时候,view也会跟着改变。这里setState方法体现的就是后者。

class Counter extends React.Component {
  // 定义数据
  state = {
    count: 0
  }
  // 定义修改数据的方法
  setCount = () => {
    this.setState({
      count: this.state.count + 1
    })
  }
  // 使用数据 并绑定事件
  render () {
    return <button onClick={this.setCount}>{this.state.count}</button>
  }
}

状态不可变

概念:不要直接修改状态的值,而是基于当前状态创建新的状态值

  1. 错误的直接修改
state = {
  count : 0,
  list: [1,2,3],
  person: {
     name:'jack',
     age:18
  }
}
// 直接修改简单类型Number
this.state.count++
++this.state.count
this.state.count += 1
this.state.count = 1

// 直接修改数组
this.state.list.push(123)
this.state.list.spice(1,1)

// 直接修改对象
this.state.person.name = 'rose'
  1. 基于当前状态创建新值
this.setState({
    count: this.state.count + 1
    list: [...this.state.list, 4],
    person: {
       ...this.state.person,
       // 覆盖原来的属性 就可以达到修改对象中属性的目的
       name: 'rose'
    }
})

表单处理

使用React处理表单元素,一般有俩种方式:

  1. 受控组件 (推荐使用)
  2. 非受控组件 (了解)

受控表单组件

什么是受控组件? input框自己的状态被React组件状态控制
React组件的状态的地方是在state中,input表单元素也有自己的状态是在value中,React将state与表单元素的值(value)绑定到一起,由state的值来控制表单元素的值,从而保证单一数据源特性

实现步骤:
以获取文本框的值为例,受控组件的使用步骤如下:

  1. 在组件的state中声明一个组件的状态数据
  2. 将状态数据设置为input标签元素的value属性的值
  3. 为input添加change事件,在事件处理程序中,通过事件对象e获取到当前文本框的值(即用户当前输入的值)
  4. 调用setState方法,将文本框的值作为state状态的最新值

说白了就是将表单的值交给react的状态来控制。

代码实现:

import React from 'react'

class InputComponent extends React.Component {
  // 声明组件状态
  state = {
    message: 'this is message',
  }
  // 声明事件回调函数
  changeHandler = (e) => {
    this.setState({ message: e.target.value })
  }
  render () {
    return (
      <div>
        {/* 绑定value 绑定事件*/}
        <input value={this.state.message} onChange={this.changeHandler} />
      </div>
    )
  }
}


function App () {
  return (
    <div className="App">
      <InputComponent />
    </div>
  )
}
export default App

非受控表单组件

什么是非受控组件?
非受控组件就是通过手动操作dom的方式获取文本框的值,文本框的状态不受react组件的state中的状态控制,直接通过原生dom获取输入框的值

实现步骤

  1. 导入createRef 函数
  2. 调用createRef函数,创建一个ref对象,存储到名为msgRef的实例属性中
  3. 为input添加ref属性,值为msgRef
  4. 在按钮的事件处理程序中,通过msgRef.current即可拿到input对应的dom元素,而其中msgRef.current.value拿到的就是文本框的值

代码实现:

import React, { createRef } from 'react'

class InputComponent extends React.Component {
  // 使用createRef产生一个存放dom的对象容器
  msgRef = createRef()

  changeHandler = () => {
    console.log(this.msgRef.current.value)
  }

  render() {
    return (
      <div>
        {/* ref绑定 获取真实dom */}
        <input ref={this.msgRef} />
        <button onClick={this.changeHandler}>click</button>
      </div>
    )
  }
}

function App () {
  return (
    <div className="App">
      <InputComponent />
    </div>
  )
}
export default App

阶段性实践项目

在这里插入图片描述

练习说明

  1. 拉取项目模板到本地,安装依赖,run起来项目
    https://gitee.com/react-course-series/react-component-demo
  2. 完成tab点击切换激活状态交互
  3. 完成发表评论功能
  4. 完成删除评论功能

注意:生成独立无二的id 可以使用 uuid 包 yarn add uuid

import { v4 as uuid } from 'uuid'
uuid() // 得到一个独一无二的id

app.js代码如下:

import './index.css'
import avatar from './images/avatar.png'
import React from 'react'
import { v4 as uuid } from 'uuid'

// 时间格式化
function formatDate (time) {
  return `${time.getFullYear()}-${time.getMonth()}-${time.getDate()}`
}

class App extends React.Component {
  state = {
    // hot: 热度排序  time: 时间排序
    tabs: [
      {
        id: 1,
        name: '热度',
        type: 'hot'
      },
      {
        id: 2,
        name: '时间',
        type: 'time'
      }
    ],
    active: 'hot',
    list: [
      {
        id: 1,
        author: '刘德华',
        comment: '给我一杯忘情水',
        time: new Date('2021-10-10 09:09:00'),
        // 1: 点赞 0:无态度 -1:踩
        attitude: 1
      },
      {
        id: 2,
        author: '周杰伦',
        comment: '哎哟,不错哦',
        time: new Date('2021-10-11 09:09:00'),
        // 1: 点赞 0:无态度 -1:踩
        attitude: 0
      },
      {
        id: 3,
        author: '五月天',
        comment: '不打扰,是我的温柔',
        time: new Date('2021-10-11 10:09:00'),
        // 1: 点赞 0:无态度 -1:踩
        attitude: -1
      }
    ],
    userComment:""
  }

  //tab栏切换回调事件
  tabSwitch = (type) => {
    if (type === 'hot') {
      this.setState({

              active: 'hot',
              list:this.state.list.sort(
                  (item1,item2) => -(item1.attitude - item2.attitude)
              )

          }
      )
    }else {
      this.setState(
          {

              active: 'time',
              list:this.state.list.sort(
                  (item1,item2) => -(item1.time - item2.time)
              )

          }
      )
    }
  }

  //添加评论回调函数
  addComment = () => {
    //写法1:
      //push方法的返回值是数组长度,不是数组本身
    // const newList = [...this.state.list]
    //   newList.push(
    //       {
    //           id: uuid(),
    //           author: '临时用户',
    //           comment: this.state.userComment,
    //           time: new Date(),
    //           // 1: 点赞 0:无态度 -1:踩
    //           attitude: 0
    //       }
    //   )
    //   this.setState(
    //     {
    //       list:newList,
    //       userComment:""
    //     }
    // )

    //写法2:解构赋值

    this.setState(
        {
          list:[...this.state.list,
            {
              id: uuid(),
              author: '临时用户',
              comment: this.state.userComment,
              time: new Date(),
              // 1: 点赞 0:无态度 -1:踩
              attitude: 0
            }
          ],
          userComment:""
        }
    )

  }

  //评论框变化回调函数
  commentChange = (e) => {
      console.log(e.target.value)
    this.setState(
        {
          userComment: e.target.value
        }
    )
  }

  //删除评论的回调事件
  deleteComment = (id) => {
    this.setState(
        {
          list:this.state.list.filter(
              item => item.id !== id
          )
        }
    )
  }


  render () {
    return (
      <div className="App">
        <div className="comment-container">
          {/* 评论数 */}
          <div className="comment-head">
            <span>5 评论</span>
          </div>
          {/* 排序 */}
          <div className="tabs-order">
            <ul className="sort-container">
              {
                this.state.tabs.map(tab => (
                  <li
                    key={tab.id}
                    className={tab.type === this.state.active ? 'on' : ''}
                    onClick={() => this.tabSwitch(tab.type)}
                  >{tab.name}排序</li>
                ))
              }
            </ul>
          </div>

          {/* 添加评论 */}
          <div className="comment-send">
            <div className="user-face">
              <img className="user-head" src={avatar} alt="" />
            </div>
            <div className="textarea-container">
              <textarea
                cols="80"
                rows="5"
                placeholder="发条友善的评论"
                className="ipt-txt"
                value={this.state.userComment}
                onChange={this.commentChange}
              />
              <button className="comment-submit" onClick={this.addComment}>发表评论</button>
            </div>
            <div className="comment-emoji">
              <i className="face"></i>
              <span className="text">表情</span>
            </div>
          </div>

          {/* 评论列表 */}
          <div className="comment-list">
            {
              this.state.list.map(item => (
                <div className="list-item" key={item.id}>
                  <div className="user-face">
                    <img className="user-head" src={avatar} alt="" />
                  </div>
                  <div className="comment">
                    <div className="user">{item.author}</div>
                    <p className="text">{item.comment}</p>
                    <div className="info">
                      <span className="time">{formatDate(item.time)}</span>
                      <span className={item.attitude === 1 ? 'like liked' : 'like'}>
                        <i className="icon" />
                      </span>
                      <span className={item.attitude === -1 ? 'hate hated' : 'hate'}>
                        <i className="icon" />
                      </span>
                      <span className="reply btn-hover" onClick={() => this.deleteComment(item.id)}>删除</span>
                    </div>
                  </div>
                </div>
              ))
            }
          </div>
        </div>
      </div>)
  }
}


export default App

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

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

相关文章

structure needs cleaning结构需要清理

以Centos7&#xff0c;xfs文件系统为例进行验证&#xff0c;理论适用于其他 在使用rm命令执行删除/root下某个文件时提示rm无法删除&#xff0c;structure needs cleaning&#xff08;即结构需要清理&#xff09; 在网上搜索一下&#xff0c;你会发现千篇一律的卸载磁盘挂载&…

小程序+spring boot疫起买菜平台99212-计算机毕业设计项目选题推荐(附源码)

摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;疫起买菜平台小程序被用户普遍使用&#xff0c;为方便用户…

「Verilog学习笔记」求两个数的差值

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 timescale 1ns/1ns module data_minus(input clk,input rst_n,input [7:0]a,input [7:0]b,output reg [8:0]c );always (posedge clk or negedge rst_n) begin if (~rst_…

16、Python的常用标准库介绍

文章目录 Python被誉为“胶水语言”,这在很大程度上归功于其庞大而全面的标准库。标准库是一组预先打包的、可直接使用的模块集合,无需安装额外的包即可使用。这些库跨越了编程的各个领域,几乎每个Python开发者都会在他们的编程生涯中用到它们。这篇文章将介绍50个常用的Pyt…

爆火的正规号卡推广分销 流量卡分销代理平台

正规号卡推广和流量卡分销代理可以通过“聚量推客”申请 聚量推客上的号卡单价高 数据及时 结算快&#xff0c;你还可以搭配平台上的拉新产品各种推广场景&#xff0c;更值得拥有哦

【T690 之十二】基于方寸EVB2开发板(T690芯片)构建基于GMSSL的文件系统的方式

备注&#xff1a; 1&#xff0c;假设您已对方寸微电子的T690系列芯片的使用方式都有了一定的了解&#xff0c;然后需要构建基于GMSSL的文件系统&#xff0c;此文才对您有意义&#xff1b; 2&#xff0c;若您对方寸微电子的T690芯片不了解&#xff0c;但想进一步了解它&#xff…

Modbus入门

Modbus入门 ModbusModbus模拟工具模拟工具使用配置Slave配置Poll C#使用ModBus通讯 Modbus modbus使用范围广泛&#xff0c;广泛应用于各类仪表&#xff0c;PLC等。它属于应用层协议&#xff0c;底层硬件基于485/以太网。 Modbus的存储区有&#xff1a;输入线圈&#xff08;布尔…

[Day1]工业网络智能控制:三层交换机与防火墙

基础知识点 什么是内网? 内网就是我们平常说的局域网。局域网就是在固定的一个地理区域内由2台以上的电脑用网线和其他网络设备搭建而成的一个封闭的计算机组。它可以是邻居之间的2台电脑&#xff0c;也可以是一幢100层大楼里的1000台电脑。局域网可以是独立封闭运行的&…

CSS 显示、定位、布局、浮动

一、CSS 显示&#xff1a; CSS display属性设置元素应如何显示&#xff1b;CSS visibility属性指定元素应可见还是隐藏。隐藏元素可以通过display属性设置为“none”&#xff0c;也可以通过visibility属性设置为“hidden”。两者的区别&#xff1a;visibility:hidden可以隐藏某…

七个很实用的开源项目「GitHub 热点速览」

本周特推的两个项目都是异常实用的项目&#xff0c;一个接棒上周的视频重制项目 video-retalking 这次则是直接将视频替换成另外一个语种&#xff1b;另外一个则是解决日志阅读问题的 tailspin&#xff0c;让你在成千上万条日志中快速定位特定的日志。 此外&#xff0c;还有两大…

从零开始搭建微服务(二)

忘记了软件还没有装全,今天先把所有的软件装上,nacos已经装过了我们就不在装了,剩余的软件全部都是通过docker安装,我在centos7里面 1. 安装docker 安装dockeryum -y install docker开机自启 systemctl enable docker启动dockre systemctl start docker查看docker版本 doc…

公司加入域的电脑关闭登陆密码

公司电脑一般会统一加入公司内部的域&#xff0c;同时基于安全等原因&#xff0c;屏幕保护和桌面密码不能自己个性化设置&#xff0c;因此一会儿不进行操作就会被锁定&#xff0c;使用时还需要重新输入密码&#xff0c;这种情况可以通过修改注册表来解决。 同时按winr键&#x…

ONNX相关

https://github.com/open-mmlab/mmdeploy/blob/master/docs/zh_cn/tutorial/03_pytorch2onnx.md TorchScript 解读&#xff08;一&#xff09;&#xff1a;初识 TorchScript - 知乎 onnx算子文档 https://github.com/onnx/onnx/blob/main/docs/Operators.mdhttps://github.com…

电子水表和智能水表哪个好?

随着科技的不断发展&#xff0c;传统的水表已经逐渐无法满足人们对于用水管理的需求。于是&#xff0c;电子水表和智能水表应运而生。这两种水表在功能和性能上都有一定的优势&#xff0c;但究竟哪个更好呢&#xff1f;今天小编将为大家全面解析电子水表和智能水表的优劣&#…

【广州华锐互动】气象卫星监测AR互动教学软件为气象学习带来更多乐趣

由VR制作公司广州华锐互动开发的气象卫星监测AR互动教学软件是一款结合了增强现实(AR)技术与气象监测技术的教育软件。它通过直观、互动的方式&#xff0c;帮助学生更好地理解和掌握气象监测的基本知识和技能。本文将从气象卫星监测AR互动教学软件的应用场景、优势分析、实际意…

Vue2+elementui项目导出el-table的数据为xlsx表格

1、安装3个插件 &#xff08;file-saver、 xlsx、script-loader&#xff09; npm install -S file-saver xlsxnpm install -D script-loader 2、在utils目录下新建一个 Export2Excel.js 脚本 &#xff08;我的路径在/utils/Export2Excel.js&#xff09; /* eslint-disable *…

Vue动手实践p110和p107小试牛刀

一、小试牛刀 真的很不好意思诸位&#xff0c;最近事情有点多&#xff0c;更新进度缓慢了&#xff0c;这次就简单的再复习一下vue组件的内容&#xff0c;大家可以自行研究一下&#xff0c;我就不深入解析了。 <body> <div id"app"><button click&qu…

vr航天探索科普展vr航天科普亲子嘉年华

随着生活水平的提高&#xff0c;人们的体验事物也在变多&#xff0c;学习方面也越来越多元化。现在我国的航天技术也在快速的发展&#xff0c;在宇宙太空中有我们的一席之位。航天大发展离不开每个航天人的努力。现在很多的人从娃娃做起&#xff0c;让他们更早的体验和了解外太…

YOLOv8优化:block系列篇 | Neck系列篇 |可重参化EfficientRepBiPAN优化Neck

🚀🚀🚀本文改进: 可重参化EfficientRepBiPAN优化Neck 如何在YOLOv8下使用:1)结合neck; 🚀🚀🚀EfficientRepBiPAN在各个领域都有ying 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1.原理…

最新Cocos Creator 3.x 如何动态修改3D物体的透明度

Cocos Creator 3.x 的2D UI有个组件UIOpacity组件可以动态修改UI的透明度,非常方便。很多同学想3D物体上也有一个这样的组件来动态的控制与修改3D物体的透明度。今天基于Cocos Creator 3.8 来实现一个可以动态修改3D物体透明度的组件Opacity3D。 对啦&#xff01;这里有个游戏…