React学习05-React Router 5

news2024/9/25 9:40:09

React Router 5

相关理解

SPA

  1. 单页Web应用(single page web application,SPA)。
  2. 整个应用只有一个完整的页面
  3. 点击页面中的链接不会刷新页面,只会做页面的局部更新。
  4. 数据都需要通过ajax请求获取, 并在前端异步展现。

路由

  1. 什么是路由?

    • 一个路由就是一个映射关系(key:value)
    • key为路径, value可能是functioncomponent
  2. 路由分类

    • 后端路由:
      • 理解: valuefunction, 用来处理客户端提交的请求
      • 注册路由: router.get(path, function(req, res))
      • 工作过程:当node接收到一个请求时, 根据请求路径找到匹配的路由, 调用路由中的函数来处理请求, 返回响应数据
    • 前端路由:
      • 浏览器端路由,valuecomponent,用于展示页面内容
      • 注册路由: <Route path="/test" component={Test}>
      • 工作过程:当浏览器的path变为/test时, 当前路由组件就会变为Test组件
  3. 前端路由的基石:history

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>前端路由的基石_history</title>
    </head>
    <body>
    	<a href="http://www.atguigu.com" onclick="return push('/test1') ">push test1</a><br><br>
    	<button onClick="push('/test2')">push test2</button><br><br>
    	<button onClick="replace('/test3')">replace test3</button><br><br>
    	<button onClick="back()">&lt;= 回退</button>
    	<button onClick="forword()">前进 =&gt;</button>
    
    	<script type="text/javascript" src="https://cdn.bootcss.com/history/4.7.2/history.js"></script>
    	<script type="text/javascript">
    		// let history = History.createBrowserHistory() //方法一,直接使用H5推出的history身上的API
    		let history = History.createHashHistory() //方法二,hash值(锚点)
    
    		function push (path) {
    			history.push(path)
    			return false
    		}
    
    		function replace (path) {
    			history.replace(path)
    		}
    
    		function back() {
    			history.goBack()
    		}
    
    		function forword() {
    			history.goForward()
    		}
    
    		history.listen((location) => {
    			console.log('请求路由路径变化了', location)
    		})
    	</script>
    </body>
    </html>
    

react-router-dom

  1. react的一个插件库;
  2. 专门用来实现一个SPA应用;
  3. 基于react的项目基本都会用到此库。

路由的基本使用

原理:点击导航链接引起路径变化,路径变化被router监测到,进行匹配组件;单页面,多组件。

安装React Router 5

npm i react-router-dom@5

简单案例

组件:

image.png

About组件(Home组件同理)

import React, { Component } from 'react'

export default class About extends Component {
  render() {
    return (
      <h3>我是About的内容</h3>
    )
  }
}

App组件

import React, { Component } from 'react'
import {Link, Route} from 'react-router-dom'
import About from './components/About'
import Home from './components/Home'


export default class App extends Component {

    render() {
        return (
            <div>
                <div className="row">
                    <div className="col-xs-offset-2 col-xs-8">
                        <div className="page-header"><h2>React Router Demo</h2></div>
                    </div>
                </div>
                <div className="row">
                    <div className="col-xs-2 col-xs-offset-2">
                        <div className="list-group">
                            {/* 原生html中,靠a标签跳转不同的页面 */}
                            {/* <a className="list-group-item" href="./about.html">About</a>
                            <a className="list-group-item active" href="./home.html">Home</a> */}

                            {/* 在React中靠路由链接实现 --- 编写路由链接 */}
                            <Link className="list-group-item" to="/about">About</Link>
                            <Link className="list-group-item" to="/home">Home</Link>
                        </div>
                    </div>
                    <div className="col-xs-6">
                        <div className="panel">
                            <div className="panel-body">
                                {/* 注册路由 */}
                                <Route path="/about" component={About}/>
                                <Route path="/home" component={Home}/>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        )
    }
}

index.js

import React from 'react'
import ReactDOM from 'react-dom'
import App from './App'
import {BrowserRouter} from 'react-router-dom'

ReactDOM.render(
    <BrowserRouter><App /></BrowserRouter>,
    document.getElementById('root')
)

注意:

  1. 整个网页由一个router管理,即Link标签与Route标签要由同一个BrowserRouter标签包裹,为了方便,可以直接将App组件包裹
  2. HashRouter使用#接路由路径,#后面的内容不会传给服务器

效果:

GIF 2022-5-14 21-57-20.gif

路由组件和一般组件

import React, { Component } from 'react'
import {Link, Route} from 'react-router-dom'
import About from './pages/About' // About是路由组件
import Home from './pages/Home' // Home是路由组件
import Header from './components/Header' // Header是一般组件


export default class App extends Component {

    render() {
        return (
            <div>
                <div className="row">
                    <div className="col-xs-offset-2 col-xs-8">
                        <Header/>
                    </div>
                </div>
                <div className="row">
                    <div className="col-xs-2 col-xs-offset-2">
                        <div className="list-group">
                            {/* 原生html中,靠a标签跳转不同的页面 */}
                            {/* <a className="list-group-item" href="./about.html">About</a>
                            <a className="list-group-item active" href="./home.html">Home</a> */}

                            {/* 在React中靠路由链接实现 --- 编写路由链接 */}
                            <Link className="list-group-item" to="/about">About</Link>
                            <Link className="list-group-item" to="/home">Home</Link>
                        </div>
                    </div>
                    <div className="col-xs-6">
                        <div className="panel">
                            <div className="panel-body">
                                {/* 注册路由 */}
                                <Route path="/about" component={About}/>
                                <Route path="/home" component={Home}/>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        )
    }
}
  1. 写法不同

    • 一般组件:<Demo/>
    • 路由组件:<Route path="/demo" component={Demo}/>
    • 值得注意的是,React Router 6component属性已替换为element,参数中可以写为一般组件的形式
  2. 存放位置不同

    • 一般组件:components
    • 路由组件:pages
  3. 接收到的props不同

    • 一般组件:写组件标签时传递的内容

    • 路由组件:接收到固定的属性

      history:
      	go: ƒ go(n)
      	goBack: ƒ goBack()
      	goForward: ƒ goForward()
      	push: ƒ push(path, state)
      	replace: ƒ replace(path, state)
      
      location:
      	pathname: "/demo"
      	search: ""
      	state: undefined
      
      match:
      	params: {}
      	path: "/demo"
      	url: "/demo"
      
    • image.png

NavLink

NavLink被点击后,会为当前样式追加一个类,默认类名为active,可通过activeClassName修改

例如,在App.css中编写样式(此处使用!important是因为bootstrap的优先级过高:

.my-active {
    background-color: olivedrab !important;
    color: white !important;
}

NavLink如下所示:

<NavLink activeClassName='my-active' className="list-group-item" to="/about">About</NavLink>
<NavLink activeClassName='my-active' className="list-group-item" to="/home">Home</NavLink>

效果:

GIF 2022-5-14 23-13-40.gif

二次封装NavLink

封装一个MyNavLink,用于指定固定的classNameactiveClassName,属于一般组件

import React, { Component } from 'react'
import {NavLink} from 'react-router-dom'

export default class MyNavLink extends Component {
    render() {
        return (
            <NavLink activeClassName='my-active' className="list-group-item" {...this.props} />
        )
  }
}

使用时直接写MyNavLink标签即可:

<MyNavLink to="/about">About</MyNavLink> {/* 标签体内容是特殊的标签属性: children */}
<MyNavLink to="/home">Home</MyNavLink>

Switch

注意:在React Router 6中,Switch已被Routes替代

使用<Switch></Switch>将注册的路由包裹起来,匹配路径时只匹配最先出现的组件

<Switch>
	<Route path="/about" component={About}/>
	<Route path="/home" component={Home}/>
</Switch>
  1. 通常情况下,pathcomponent是一一对应的关系
  2. Switch可以提高路由匹配效率(单一匹配)

Redirect

当所有路由都无法匹配时,跳转到Redirect指定的路由,一般写在所有路由注册的最下方

{/* 注册路由 */}
<Switch>
    <Route path="/about" component={About}/>
    <Route path="/home" component={Home}/>
    <Redirect to="/about" />
</Switch>

多级路径刷新页面样式丢失

原因:href="./css/bootstrap.css"是从当前路径开始寻找,当多级路径写为如<MyNavLink to="/abc/home">Home</MyNavLink>时,将在/abc下寻找css文件,故刷新后样式会丢失

GIF 2022-5-15 20-17-30.gif

解决方法:

  1. public/index.html中,css的引入使用<link rel="stylesheet" href="/css/bootstrap.css"> - 常用
  2. public/index.html中,css的引入使用<link rel="stylesheet" href="%PUBLIC_URL%/css/bootstrap.css"> - 常用
  3. 使用HashRouter

路由的模糊匹配与严格匹配

  1. React Router 5默认使用的是模糊匹配,即:输入的路径必须要包含匹配的路径,且顺序要一致

  2. 开启严格匹配:

    <Route exact={true} path="/about" component={About}/>
    <Route exact path="/home" component={Home}/>
    
  3. 不要随意开启严格匹配,有需要的时候再使用,开启会导致无法匹配二级路由

嵌套路由

  1. 注册子路由时要写上父路由的path值,否则无法匹配到父级路由
  2. 路由的匹配是按照注册路由的顺序进行的

Home组件

import React, { Component } from 'react'
import { Switch, Route, Redirect } from 'react-router-dom'
import MyNavLink from '../../components/MyNavLink'
import News from './News'
import Message from './Message'

export default class Home extends Component {
  render() {
    return (
      <div>
        <h3>我是Home的内容</h3>
        <div>
          <ul className="nav nav-tabs">
            <li>
              <MyNavLink to="/home/news">News</MyNavLink>
            </li>
            <li>
              <MyNavLink to="/home/message">Message</MyNavLink>
            </li>
          </ul>
          {/* 注册路由 */}
          <Switch>
            <Route path="/home/news" component={News} />
            <Route path="/home/message" component={Message} />
            <Redirect to="/home/news" />
          </Switch>
        </div>
      </div>
    )
  }
}

GIF 2022-5-15 21-54-32.gif

向路由组件传参

准备工作:声明Detail组件,用来展示message的详情,像这样:

image.png

import React, { Component } from 'react'

const detailData = [
    {id: '01', content: '小爱同学'},
    {id: '02', content: '嘿Siri'},
    {id: '03', content: '你好小娜'}
]

export default class Detail extends Component {
    render() {
        return (
            <ul>
                <li>id: </li>
                <li>title: </li>
                <li>content: </li>
            </ul>
        )
    }
}

传递params参数

  1. 路由链接(携带参数):<Link to='/demo/test/tom/18'}>详情</Link>
  2. 注册路由(声明接收):<Route path="/demo/test/:name/:age" component={Test}/>
  3. 接收参数:this.props.match.params

在Detail组件中console.log(this.props)可以看到如图所示的属性:image.png

Message组件

import React, { Component } from 'react'
import { Link, Route } from 'react-router-dom'
import Detail from './Detail'

export default class Message extends Component {

    state = {
        messageArr: [
            {id: '01', title: '消息1'},
            {id: '02', title: '消息2'},
            {id: '03', title: '消息3'}
        ]
    }

    render() {
        const {messageArr} = this.state
        return (
            <div>
                <ul>
                    {messageArr.map((msgObj) => {
                        return (
                            <li key={msgObj.id}>
                                {/* 向路由组件传递params参数 */}
                                <Link to={`/home/message/detail/${msgObj.id}/${msgObj.title}`}>{msgObj.title}</Link>
                            </li>
                        )
                    })}
                </ul>
                <hr />
                {/* 声明接收params参数 */}
                <Route path="/home/message/detail/:id/:title" component={Detail} />
            </div>
        )
    }
}

Detail组件

import React, { Component } from 'react'

const detailData = [
    {id: '01', content: '小爱同学'},
    {id: '02', content: '嘿Siri'},
    {id: '03', content: '你好小娜'}
]

export default class Detail extends Component {
    render() {
        // 接收params参数
        const {id, title} = this.props.match.params
        const findContent = detailData.find((detailObj) => {
            return detailObj.id === id
        })
        return (
            <ul>
                <li>id: {id}</li>
                <li>title: {title}</li>
                <li>content: {findContent.content}</li>
            </ul>
        )
    }
}

GIF 2022-5-15 22-34-34.gif

传递search参数

(传递的时候省心一点,接收的时候麻烦一点)

  1. 路由链接(携带参数):<Link to='/demo/test?name=tom&age=18'}>详情</Link>
  2. 注册路由(无需声明,正常注册即可):<Route path="/demo/test" component={Test}/>
  3. 接收参数:this.props.location.search
  4. 备注:获取到的searchurlencoded编码字符串,需要借助querystring解析

在Detail组件中console.log(this.props)可以看到如图所示的属性:

image.png

Message组件

render() {
    const {messageArr} = this.state
    return (
        <div>
            <ul>
                {messageArr.map((msgObj) => {
                    return (
                        <li key={msgObj.id}>
                            {/* 向路由组件传递search参数 */}
                            <Link to={`/home/message/detail/?id=${msgObj.id}&title=${msgObj.title}`}>{msgObj.title}</Link>
                        </li>
                    )
                })}
            </ul>
            <hr />
            {/* search参数无需声明接收,正常注册路由即可 */}
            <Route path="/home/message/detail" component={Detail} />
        </div>
    )
}

Detail组件

// 接收search参数
const {search} = this.props.location
const {id, title} = qs.parse(search.slice(1))

不过qs好像要过时了:

image.png

传递state参数

传递的内容不会在地址栏展示,与组件的状态(state)不同

  1. 路由链接(携带参数):<Link to={{pathname: '/demo/test', state: {name: 'tom', age: 18}}}>详情</Link>
  2. 注册路由(无需声明,正常注册即可):<Route path="/demo/test" component={Test}/>
  3. 接收参数:this.props.location.state
  4. 备注:刷新也可以保留住参数,但清除浏览器数据后不可
  5. state参数默认replace=true(猜想)

在Detail组件中console.log(this.props)可以看到如图所示的属性:

image.png

Message组件

{/* 向路由组件传递state参数 */}
<Link to={{pathname: '/home/message/detail', state: {id: msgObj.id, title: msgObj.title}}}>{msgObj.title}</Link>

{/* state参数无需声明接收,正常注册路由即可 */}
<Route path="/home/message/detail" component={Detail} />

Detail组件

// 接收state参数
const {id, title} = this.props.location.state || {}

编程式路由导航

借助this.props.history的API实现跳转、前进、后退:

-this.prosp.history.push()
-this.prosp.history.replace()
-this.prosp.history.goBack()
-this.prosp.history.goForward()
-this.prosp.history.go()
import React, { Component } from 'react'
import { Link, Route } from 'react-router-dom'
import Detail from './Detail'

export default class Message extends Component {

    state = {
        messageArr: [
            {id: '01', title: '消息1'},
            {id: '02', title: '消息2'},
            {id: '03', title: '消息3'}
        ]
    }

    pushShow = (id, title) => {
        // push跳转 + 携带params参数
        // this.props.history.push(`/home/message/detail/${id}/${title}`)

        // push跳转 + 携带search参数
        // this.props.history.push(`/home/message/detail?id=${id}&title=${title}`)

        // push跳转 + 携带state参数
        this.props.history.push('/home/message/detail', {id, title})
    }

    replaceShow = (id, title) => {
        // replace跳转 + 携带params参数
        // this.props.history.replace(`/home/message/detail/${id}/${title}`)

        // replace跳转 + 携带search参数
        this.props.history.replace(`/home/message/detail?id=${id}&title=${title}`)

        // replace跳转 + 携带state参数
        this.props.history.replace('/home/message/detail', {id, title})
    }

    render() {
        const {messageArr} = this.state
        return (
            <div>
                <ul>
                    {messageArr.map((msgObj) => {
                        return (
                            <li key={msgObj.id}>
                                {/* 向路由组件传递params参数 */}
                                {/* <Link to={`/home/message/detail/${msgObj.id}/${msgObj.title}`}>{msgObj.title}</Link> */}
                                &nbsp;<button onClick={() => this.pushShow(msgObj.id, msgObj.title)}>push查看</button>
                                &nbsp;<button onClick={() => this.replaceShow(msgObj.id, msgObj.title)}>replace查看</button>

                                {/* 向路由组件传递search参数 */}
                                {/* <Link to={`/home/message/detail/?id=${msgObj.id}&title=${msgObj.title}`}>{msgObj.title}</Link> */}
                            
                                {/* 向路由组件传递state参数 */}
                                <Link to={{pathname: '/home/message/detail', state: {id: msgObj.id, title: msgObj.title}}}>{msgObj.title}</Link>
                            </li>
                        )
                    })}
                </ul>
                <hr />
                {/* 声明接收params参数 */}
                {/* <Route path="/home/message/detail/:id/:title" component={Detail} /> */}

                {/* search参数无需声明接收,正常注册路由即可 */}
                {/* <Route path="/home/message/detail" component={Detail} /> */}

                {/* state参数无需声明接收,正常注册路由即可 */}
                <Route path="/home/message/detail" component={Detail} />
            </div>
        )
    }
}

GIF 2022-5-21 13-06-58.gif

路由的跳转更加灵活:

需求:切换到News路由后,等待3秒,自动跳转到Message

import React, { Component } from 'react'

export default class News extends Component {

  componentDidMount() {
    setTimeout(() => {
        this.props.history.push('/home/message')
    }, 3000)
  }

  render() {
    return (
        <ul>
            <li>news001</li>
            <li>news002</li>
            <li>news003</li>
        </ul>
    )
  }
}

withRouter

withRouter可以加工一般组件,让一般组件具备路由组件所特有的API,其返回值是一个新组件

import React, { Component } from 'react'
import { withRouter } from 'react-router-dom'

class Header extends Component {

  back = () => {
    this.props.history.goBack()
  }

  forward = () => {
    this.props.history.goForward()
  }

  render() {
    return (
        <div className="page-header">
          <h2>React Router Demo</h2>
          <button onClick={this.back}>后退</button>&nbsp;
          <button onClick={this.forward}>前进</button>
        </div>
    )
  }
}

export default withRouter(Header)

Browser RouterHash Router

  1. 底层原理不同:
    • BrowserRouter使用的是H5的history API,不兼容IE9及以下版本。
    • HashRouter使用的是URL的哈希值。
  2. path表现形式不同:
    • BrowserRouter的路径中没有#,例如:localhost:3000/demo/test
    • HashRouter的路径包含#,例如:localhost:3000/#/demo/test
  3. 刷新后对路由state参数的影响:
    • BrowserRouter没有任何影响,因为state保存在history对象中。
    • HashRouter刷新后会导致路由state参数的丢失!!!
  4. 备注:HashRouter可以用于解决一些路径错误相关的问题。

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

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

相关文章

全球十大数据安全事件

2021年&#xff0c;数据隐私泄露事件频发&#xff0c;涉及面广&#xff0c;影响力大&#xff0c;企业因此陷入数据保护合规与社会舆情压力的双重危机。近日&#xff0c;有国外媒体梳理了2021年十大数据泄密事件&#xff0c;并对事件进行了点评分析&#xff0c;可供读者参考。据…

第二十九讲:神州路由器DHCP协议的配置

实验拓扑图如下所示 操作步骤&#xff1a; 步骤1&#xff1a;按照图1&#xff0c;正确连接拓扑结构图。 步骤2&#xff1a;为路由器设置主机名称和配置接口IP地址。 Router>enable &#xff01;进入特权模式 Router #config &a…

MySQL高级【SQL性能分析】

目录 1&#xff1a;SQL性能分析 1.1&#xff1a;SQL执行频率 1.2&#xff1a;慢查询日志 1.3&#xff1a;profile详情 1.4&#xff1a;explain 1&#xff1a;SQL性能分析 1.1&#xff1a;SQL执行频率 MySQL 客户端连接成功后&#xff0c;通过 show [session|global] sta…

2022年的5G行业:“5G+”很火,5G网络迟迟未能普及

作者 | 曾响铃 文 | 响铃说 2022年&#xff0c;5G行业依旧是如火如荼地发展&#xff0c;5G技术继续深刻地改变着我们的生活与生产&#xff0c;影响社会经济发展的方方面面。 回顾过去的一年&#xff0c;5G行业有看点&#xff0c;也有疑虑。 5G网络已基本覆盖全国。截至 202…

PaddleNLP开源基于UIE的情感分析,解决小样本难题,助力客户意见洞察与舆情分析!

情感分析&#xff08;Sentiment Analysis&#xff09;是近年来国内外研究的热点&#xff0c;旨在对带有情感色彩的主观性文本进行分析、处理、归纳和推理。情感分析具有广泛的应用场景&#xff0c;可被应用于消费决策、舆情分析、个性化推荐等领域。 如上图所示&#xff0c;情…

移位操作符、位操作符,原码、反码、补码

整数的二进制的表达形式有3种。原码反码补码下面我们举一个例子吧十进制的2原码&#xff1a;00000000000000000000000000000010&#xff08;常见的形式&#xff09;反码&#xff1a;00000000000000000000000000000010补码&#xff1a;00000000000000000000000000000010小结 正整…

k8s集群部署02

k8s集群部署02k8s集群部署02仍然报错若镜像拉取过慢原因k8s集群部署02 一、pod基本操作Pod是可以创建和管理Kubernetes计算的最小可部署单元&#xff0c;一个Pod代表着集群中运行的一个进程&#xff0c;每个pod都有一个唯一的ip。一个pod类似一个豌豆荚&#xff0c;包含一个或…

Hack the Box CTF 比赛 简单难度 XOR 密码学题目 Crypto 流程| Multikey Walkthrough

这是近期参加HTB夺旗战时遇到的一道难度为简单的密码学Crypto题目。但是我觉得挺有意思&#xff0c;就做下记录。 1. 题目&#xff1a; 题干没有太多的内容&#xff0c;就是一段python程序&#xff0c;和一个output的加密结果&#xff0c;如下。 Python&#xff1a; import …

【数据结构】手推堆实现,拳打堆排序,脚踩Top-k

目录一.完全二叉树的顺序结构二.堆的概念及结构三.堆的实现1.堆向下调整2.向下调整建堆3.向下调整建堆时间复杂度4.堆的插入&#xff08;向上调整&#xff09;5.向上调整建堆6.向上调整建堆时间复杂度7.堆的删除8.堆的代码实现四.Top-K问题五.堆排序一.完全二叉树的顺序结构 堆…

GPIO实验

一、GPIO简介 GPIO&#xff08;General-purpose input/output&#xff09;即通用型输入输出&#xff0c;GPIO可以控制连接在其之上的引脚实现信号的输入和输出 芯片的引脚与外部设备相连&#xff0c;从而实现与外部硬件设备的通讯、控制及信号采集等功能 实验步骤1. 通过电路…

第十七讲:神州三层交换机DHCP服务器配置

DHCP是基于Client&#xff0d;Server模式的协议&#xff0c;DHCP客户机向DHCP服务器索取网络地址及配置参数&#xff1b;服务器为客户机提供网络地址及配置参数&#xff1b;当DHCP客户机和DHCP服务器不在同一子网时&#xff0c;需要由DHCP中继为DHCP客户机和DHCP服务器传递DHCP…

java企业通知小程序微信消息推送小程序企业消息通知系统网站源码

简介 本系统主要是利用小程序和springboot开发的企业分组消息推送&#xff0c;主要是员工关注小程序&#xff0c;由分组领导创建消息主体并设置消息提醒时间&#xff0c;利用微信的消息模板对选定的员工进行消息提醒推送。比如公司的技术部需要在11月3号早上8点举行晨会&#…

【Java编程进阶】面向对象思想初识

推荐学习专栏&#xff1a;Java 编程进阶之路【从入门到精通】 文章目录1. 面向对象初识2. 类和对象2.1 类的定义2.2 对象的创建和使用3. 构造方法4. 方法重载5. static 关键字5.1 static 方法5.2 static 变量6. 对象的引用和 this7. 总结1. 面向对象初识 之前我们学习了 C 语言…

P2367 语文成绩和P5542 Painting The Barn S(一维和二维差分)

目录 前言 一、P2367 语文成绩 二、P5542 Painting The Barn S 前言 图文详解一维差分 图文详解二维差分 一、P2367 语文成绩 题目背景&#xff1a; 语文考试结束了&#xff0c;成绩还是一如既往地有问题。 题目描述&#xff1a; 语文老师总是写错成绩&#xff0c;所以当…

关于C语言中内存分配

一、static在C语言里面可以用来修饰变量&#xff0c;也可以用来修饰函数。 1、 先看用来修饰变量的时候。变量在C语言里面可分为存在全局数据区、栈和堆里。 其实我们平时所说的堆栈是栈而不是堆&#xff0c;不要弄混。 例如&#xff1a;在file.c中 int a ; int main() { int b…

如何在 Python 中自动化处理 Excel 表格?

考虑一个场景&#xff0c;要求在网站上为 30,000 名员工创建一个帐户。手动重复执行此任务会非常枯燥乏味。此外&#xff0c;这将花费太多时间&#xff0c;这不是一个明智的决定。 现在想象一下从事数据输入工作的员工的生活。他们的工作是从 Excel 表格中获取数据并将其插入其…

CSS 实现灯笼动画,祝大家元旦快乐

前言 &#x1f44f;CSS 实现大红灯笼动画&#xff0c;祝大家元旦快乐&#xff0c;2023越来越棒&#xff01;速速来Get吧~ &#x1f947;文末分享源代码。记得点赞关注收藏&#xff01; 1.实现效果 2.实现步骤 定义一个灯笼的背景色bg&#xff0c;线条颜色lineColor :root …

数字时代下, 企业如何保证数据的安全

随着全球数字化进程的蓬勃发展&#xff0c;在互联网时代下技术和数据深度融合的数字经济模式为许多行业带来了更大创收。数据也已经成为了五大核心生产要素之一&#xff0c;驱动着国家、社会、企业全方位高速发展。“迎接数字时代&#xff0c;激活数据要素潜能&#xff0c;推进…

四、 Spring-MVC

MVC MVC &#xff1a;Model View Controller&#xff0c;是模型(model)&#xff0d;视图(view)&#xff0d;控制器(controller)的缩写&#xff0c;一种软件设计规范。本质上也是一种解耦。 Model&#xff08;模型&#xff09;是应用程序中用于处理应用程序数据逻辑的部分。通常…

使用CLIP构建视频搜索引擎

CLIP(Contrastive Language-Image Pre-training)是一种机器学习技术&#xff0c;它可以准确理解和分类图像和自然语言文本&#xff0c;这对图像和语言处理具有深远的影响&#xff0c;并且已经被用作流行的扩散模型DALL-E的底层机制。在这篇文章中&#xff0c;我们将介绍如何调整…