当前位置: 首页 > news >正文

高端网站建设的公司哪家好/网站网络推广服务

高端网站建设的公司哪家好,网站网络推广服务,网站案例介绍,网站技术招标怎么做useReducer usereducer 相当于 复杂的 useState 当状态更新逻辑较复杂时可以考虑使用 useReducer。useReducer 可以同时更新多个状态,而且能把对状态的修改从组件中独立出来。 相比于 useState,useReducer 可以更好的描述“如何更新状态”。例如&#…

useReducer

usereducer 相当于 复杂的 useState
状态更新逻辑较复杂时可以考虑使用 useReducer。useReducer 可以同时更新多个状态,而且能把对状态的修改从组件中独立出来。

相比于 useState,useReducer 可以更好的描述“如何更新状态”。例如:组件负责发出行为,useReducer 负责更新状态。

好处是:让代码逻辑更清晰,代码行为更易预测

1. useReducer 的语法格式

useReducer 的基础语法如下:

const [state, dispatch] = useReducer(reducer, initState, initAction?)

其中:

1. reducer 是一个函数,类似于 (prevState, action) => newState。形参 prevState 表示旧状态,形参 action 表示本次的行为,返回值 newState 表示处理完毕后的新状态。

2. initState 表示初始状态,也就是默认值。

3. initAction 是进行状态初始化时候的处理函数,它是可选的,如果提供了 initAction 函数,则会把 initState 传递给 initAction 函数进行处理,initAction 的返回值会被当做初始状态。

4. 返回值 state 是状态值。dispatch 是更新 state 的方法,让他接收 action 作为参数,useReducer 只需要调用 dispatch(action) 方法传入的 action 即可更新 state。

2. 定义组件的基础结构

定义名为 Father 的父组件如下:

import React from 'react'// 父组件
export const Father: React.FC = () => {return (<div><button>修改 name 的值</button><div className="father"><Son1 /><Son2 /></div></div>)
}

定义名为 Son1 和 Son2 的两个子组件如下:

// 子组件1
const Son1: React.FC = () => {return <div className="son1"></div>
}// 子组件2
const Son2: React.FC = () => {return <div className="son2"></div>
}

在 index.css 中添加对应的样式:

.father {display: flex;justify-content: space-between;width: 100vw;
}.son1 {background-color: orange;min-height: 300px;flex: 1;padding: 10px;
}.son2 {background-color: lightblue;min-height: 300px;flex: 1;padding: 10px;
}

3. 定义 useReducer 的基础结构

1、按需导入 useReducer 函数:

import React, { useReducer } from 'react'

2、定义初始数据

const defaultState = { name: 'liulongbin', age: 16 }

3、定义 reducer 函数,它的作用是:根据旧状态,进行一系列处理,最终返回新状态

// 第一个参数永远是上一次的旧状态
const reducer = (prevState) => {// 首次进入页面 不会触发 reducer 函数执行console.log('触发了 reducer 函数')// 必须向外返回一个处理好的新状态 return prevState
}

4、在 Father 组件中,调用 useReducer(reducerFn, 初始状态) 函数,并得到 reducer 返回的状态:

// 父组件
export const Father: React.FC = () => {// useReducer(fn, 初始数据, 对初始数据进行处理的fn)const [state] = useReducer(reducer, defaultState)console.log(state)return (<div><button>修改 name 的值</button><div className="father"><Son1 /><Son2 /></div></div>)
}

5、为 reducer 中的 initState 指定数据类型:

// 定义状态的数据类型
type UserType = typeof defaultStateconst defaultState = { name: 'liulongbin', age: 16 }// 给 initState 指定类型为 UserType
const reducer = (prevState: UserType) => {console.log('触发了 reducer 函数')return prevState
}

6、接下来,在 Father 组件中使用 state 时,就可以出现类型的智能提示啦:

// 父组件
export const Father: React.FC = () => {const [state] = useReducer(reducer, defaultState)console.log(state.name, state.age)return (<div><button>修改 name 的值</button><div className="father"><Son1 /><Son2 /></div></div>)
}

4. 使用 initAction 处理初始数据

定义名为 initAction 的处理函数,如果初始数据中的 age 为小数、负数、或 0 时,对 age 进行非法值的处理:

const initAction = (initState: UserType) => {// 把 return 的对象,作为 useReducer 的初始值return { ...initState, age: Math.round(Math.abs(initState.age)) || 18 }
}

Father 组件中,使用步骤1声明的 initAction 函数如下:

// 父组件
export const Father: React.FC = () => {// useReducer(fn, 初始数据, 对初始数据进行处理的fn)const [state] = useReducer(reducer, defaultState, initAction)// 省略其它代码...
}

在定义 defaultState 时,为 age 提供非法值,可以看到非法值在 initAction 中被处理掉了。

5. 在 Father 组件中点击按钮修改 name 的值

1. 错误示范:

不要像 vue 响应式数据一样,直接通过 state.name = 'escook' 去修改

// 父组件
export const Father: React.FC = () => {// useReducer(fn, 初始数据, 对初始数据进行处理的fn)const [state] = useReducer(reducer, defaultState, initAction)console.log(state)const onChangeName = () => {// 注意:这种用法是错误的,因为不能【直接修改 state 的值】// 因为存储在 useReducer 中的数据都是“不可变”的!// 要想修改 useReducer 中的数据,必须触发 【reducer】 函数的重新计算,// 根据 reducer 形参中的旧状态对象(initState),经过一系列处理,返回一个“全新的”状态对象state.name = 'escook'}return (<div><button onClick={onChangeName}>修改 name 的值</button><div className="father"><Son1 /><Son2 /></div></div>)
}

2. 正确的操作

为了能够触发 reducer 函数的重新执行,我们需要在调用 useReducer() 后接收返回的 dispatch 函数。示例代码如下:

// Father 父组件 
const [state, dispatch] = useReducer(reducer, defaultState, initAction)

在 button 按钮的点击事件处理函数中,调用 dispatch() 函数,从而触发 reducer 函数的重新计算:

// Father 父组件 
const onChangeName = () => { dispatch() 
}

点击 Father 组件中如下的 button 按钮:

<button onClick={onChangeName}>修改 name 的值</button>

会触发 reducer 函数的重新执行,并打印 reducer 中的 console.log(),代码如下:

const reducer = (prevState: UserType) => {console.log('触发了 reducer 函数')return prevState
}

3. 调用 dispatch 传递参数给 reducer

在 Father 父组件按钮的点击事件处理函数 onChangeName 中,调用 dispatch() 函数并把参数传递给 reducer 的第2个形参,代码如下:

const onChangeName = () => {// 注意:参数的格式为 { type, payload? }// 其中:// type 的值是一个唯一的标识符,用来【指定本次操作的类型】,一般为大写的字符串// payload 是本次操作需要用到的数据,为可选参数。在这里,payload 指的是把用户名改为字符串 '刘龙彬'dispatch({type: 'UPDATE_NAME', payload: '刘龙彬'})
}

修改 reducer 函数的形参,添加名为 action 的第2个形参,用来接收 dispatch 传递过来的数据

const reducer = (prevState: UserType, action) => {// 打印 action 的值,终端显示的值为:// {type: 'UPDATE_NAME', payload: '刘龙彬'}console.log('触发了 reducer 函数', action)return prevState
}

在 reducer 中,根据接收到的 action.type 标识符,决定进行怎样的更新操作,最终 return 一个计算好的新状态。示例代码如下:

const reducer = (prevState: UserType, action) => {console.log('触发了 reducer 函数', action)// return prevStateswitch (action.type) {// 如果标识符是字符串 'UPDATE_NAME',则把用户名更新成 action.payload 的值// 最后,一定要返回一个新状态,因为 useReducer 中每一次的状态都是“不可变的”case 'UPDATE_NAME':return { ...prevState, name: action.payload }   // 解除引用,赋予新对象// 兜底操作:// 如果没有匹配到任何操作,则默认返回上一次的旧状态default:return prevState}
}

4、为 action 指定类型

在上述的 switch...case... 代码期间,没有 TS 的类型提示,这在大型项目中是致命的。因此,我们需要为 reducer 函数的第2个形参 action 指定操作的类型:

// 1. 定义 action 的类型
type ActionType = { type: 'UPDATE_NAME'; payload: string }// 2. 为 action 指定类型为 ActionType
const reducer = (prevState: UserType, action: ActionType) => {console.log('触发了 reducer 函数', action)// 3. 删掉之前的代码,再重复编写这段逻辑的时候,会出现 TS 的类型提示,非常 Niceswitch (action.type) {case 'UPDATE_NAME':return { ...prevState, name: action.payload }default:return prevState}
}

同时,在 Father 组件的 onChangeName 处理函数内,调用 dispatch() 时也有了类型提示

const onChangeName = () => {dispatch({ type: 'UPDATE_NAME', payload: '刘龙彬' })
}

注意:在今后的开发中,正确的顺序是

​ 1、先定义 ActionType 的类型

​ 2、修改 reducer 中的 switch...case... 逻辑

​ 3、在组件中调用 dispatch() 函数!这样能够充分利用 TS 的类型提示。

6. 把用户信息渲染到子组件中

1、在 Father 父组件中,通过jsx展开语法state 数据对象绑定为 Son1Son2props 属性:

// 父组件
export const Father: React.FC = () => {const [state, dispatch] = useReducer(reducer, defaultState, initAction)const onChangeName = () => {dispatch({ type: 'UPDATE_NAME', payload: '刘龙彬' })}return (<div><button onClick={onChangeName}>修改 name 的值</button><div className="father"><!-- 通过 props 的数据绑定,把数据传递给子组件 --><Son1 {...state} /><Son2 {...state} /></div></div>)
}

2、在子组件中,指定 props 的类型为 React.FC<UserType>,并使用 props 接收和渲染数据:

// 子组件1
const Son1: React.FC<UserType> = (props) => {return (<div className="son1"><p>用户信息:</p><p>{JSON.stringify(props)}</p></div>)
}// 子组件2
const Son2: React.FC<UserType> = (props) => {return (<div className="son2"><p>用户信息:</p><p>{JSON.stringify(props)}</p></div>)
}

修改完成后,点击父组件中的 button 按钮修改用户名,我们发现两个子组件中的数据同步发生了变化。

7. 在子组件中实现点击按钮 age 自增操作

1、扩充 ActionType 的类型如下:

// 定义 action 的类型 
type ActionType = { type: 'UPDATE_NAME'; payload: string } | { type: 'INCREMENT'; payload: number }

2、在 reducer 中添加 INCREMENTcase 匹配:

const reducer = (prevState: UserType, action: ActionType) => {console.log('触发了 reducer 函数', action)switch (action.type) {case 'UPDATE_NAME':return { ...prevState, name: action.payload }// 添加 INCREMENT 的 case 匹配case 'INCREMENT':return { ...prevState, age: prevState.age + action.payload }default:return prevState}
}

3、在子组件 Son1 中添加 +1button 按钮,并绑定点击事件处理函数:

// 子组件1
const Son1: React.FC<UserType> = (props) => {const add = () => {}return (<div className="son1"><p>用户信息:</p><p>{JSON.stringify(props)}</p><button onClick={add}>+1</button></div>)
}

4、现在的问题是:子组件 Son1 中无法调用到父组件的 dispatch 函数。

为了解决这个问题,我们需要在 Father 父组件中,通过 props 把父组件中的 dispatch 传递给子组件:

// 父组件
export const Father: React.FC = () => {// useReducer(fn, 初始数据, 对初始数据进行处理的fn)const [state, dispatch] = useReducer(reducer, defaultState, initAction)const onChangeName = () => {dispatch({ type: 'UPDATE_NAME', payload: '刘龙彬' })}return (<div><button onClick={onChangeName}>修改 name 的值</button><div className="father"><Son1 {...state} dispatch={dispatch} /><Son2 {...state} /></div></div>)
}

5、在 Son1 子组件中,扩充 React.FC<UserType> 的类型,并从 props 中把 dispatch用户信息对象分离出来:

// 子组件1
const Son1: React.FC<UserType & { dispatch: React.Dispatch<ActionType> }> = (props) => {const { dispatch, ...user } = propsconst add = () => dispatch({ type: 'INCREMENT', payload: 1 })return (<div className="son1"><p>用户信息:</p><p>{JSON.stringify(user)}</p><button onClick={add}>+1</button></div>)
}

8. 在子组件中实现点击按钮 age 自减操作

扩充 ActionType 的类型如下:

// 定义 action 的类型 
type ActionType = { type: 'UPDATE_NAME'; payload: string } | { type: 'INCREMENT'; payload: number } | { type: 'DECREMENT'; payload: number }

在 reducer 中添加 DECREMENT 的 case 匹配:

const reducer = (prevState: UserType, action: ActionType) => {console.log('触发了 reducer 函数', action)switch (action.type) {case 'UPDATE_NAME':return { ...prevState, name: action.payload }case 'INCREMENT':return { ...prevState, age: prevState.age + action.payload }// 添加 DECREMENT 的 case 匹配case 'DECREMENT':return { ...prevState, age: prevState.age - action.payload }default:return prevState}
}

在子组件 Son2 中添加 -5 的 button 按钮,并绑定点击事件处理函数:

// 子组件2
const Son2: React.FC<UserType> = (props) => {const sub = () => { }return (<div className="son2"><p>用户信息:</p><p>{JSON.stringify(props)}</p><button onClick={sub}>-5</button></div>)
}

现在的问题是:子组件 Son2 中无法调用到父组件的 dispatch 函数。为了解决这个问题,我们需要在 Father 父组件中,通过 props 把父组件中的 dispatch 传递给子组件:

// 父组件
export const Father: React.FC = () => {// useReducer(fn, 初始数据, 对初始数据进行处理的fn)const [state, dispatch] = useReducer(reducer, defaultState, initAction)const onChangeName = () => {dispatch({ type: 'UPDATE_NAME', payload: '刘龙彬' })}return (<div><button onClick={onChangeName}>修改 name 的值</button><div className="father"><Son1 {...state} dispatch={dispatch} /><Son2 {...state} dispatch={dispatch} /></div></div>)
}

在 Son2 子组件中,扩充 React.FC 的类型,并从 props 中把 dispatch用户信息对象分离出来:

// 子组件2
const Son2: React.FC<UserType & { dispatch: React.Dispatch<ActionType> }> = (props) => {const { dispatch, ...user } = propsconst sub = () => dispatch({ type: 'DECREMENT', payload: 5 })return (<div className="son2"><p>用户信息:</p><p>{JSON.stringify(user)}</p><button onClick={sub}>-5</button></div>)
}

9. 在 GrandSon 组件中实现重置按钮

1、扩充 ActionType 的类型如下:

// 定义 action 的类型 
type ActionType = { type: 'UPDATE_NAME'; payload: string } | { type: 'INCREMENT'; payload: number } | { type: 'DECREMENT'; payload: number } | { type: 'RESET' }

2、在 reducer 中添加 RESETcase 匹配:

const reducer = (prevState: UserType, action: ActionType) => {console.log('触发了 reducer 函数', action)switch (action.type) {case 'UPDATE_NAME':return { ...prevState, name: action.payload }case 'INCREMENT':return { ...prevState, age: prevState.age + action.payload }case 'DECREMENT':return { ...prevState, age: prevState.age - action.payload }// 添加 RESET 的 case 匹配case 'RESET':return defaultStatedefault:return prevState}
}

3、在 GrandSon 组件中,添加重置按钮,并绑定点击事件处理函数:

const GrandSon: React.FC<{ dispatch: React.Dispatch<ActionType> }> = (props) => {const reset = () => props.dispatch({ type: 'RESET' })return (<><h3>这是 GrandSon 组件</h3><button onClick={reset}>重置</button></>)
}

10. 使用 Immer 编写更简洁的 reducer 更新逻辑

解决每次重新为 对象/数组 解除引用的问题

1、安装 immer 相关的依赖包:

npm install immer use-immer -S

2、从 use-immer 中导入 useImmerReducer 函数,并替换掉 React 官方的 useReducer 函数的调用:

// 1. 导入 useImmerReducer
import { useImmerReducer } from 'use-immer'// 父组件
export const Father: React.FC = () => {// 2. 把 useReducer() 的调用替换成 useImmerReducer()const [state, dispatch] = useImmerReducer(reducer, defaultState, initAction)
}

3、修改 reducer 函数中的业务逻辑,case 代码块中不再需要 return 不可变的新对象了,只需要在 prevState 上进行修改即可。

Immer 内部会复制并返回新对象,因此降低了用户的心智负担。改造后的 reducer 代码如下:

const reducer = (prevState: UserType, action: ActionType) => {console.log('触发了 reducer 函数', action)switch (action.type) {case 'UPDATE_NAME':// return { ...prevState, name: action.payload }prevState.name = action.payloadbreakcase 'INCREMENT':// return { ...prevState, age: prevState.age + action.payload }prevState.age += action.payloadbreakcase 'DECREMENT':// return { ...prevState, age: prevState.age - action.payload }prevState.age -= action.payloadbreakcase 'RESET':return defaultStatedefault:return prevState}
}

相关文章:

React Hooks 小记(七)_useReducer

useReducer usereducer 相当于 复杂的 useState 当状态更新逻辑较复杂时可以考虑使用 useReducer。useReducer 可以同时更新多个状态&#xff0c;而且能把对状态的修改从组件中独立出来。 相比于 useState&#xff0c;useReducer 可以更好的描述“如何更新状态”。例如&#…...

甲子光年专访天润融通CEO吴强:客户经营如何穿越低速周期?

作者&#xff5c;陈杨、编辑&#xff5c;栗子 社会的发展从来都是从交流和联络开始的。 从结绳记事到飞马传信&#xff0c;从电话电报到互联网&#xff0c;人类的联络方式一直都在随着时代的发展不断进步。只是传统社会通信受限于技术导致效率低下&#xff0c;对经济社会产生影…...

还不到6个月,GPTs黄了

相比起来&#xff0c;人们还不如使用一个足够强大、灵活且通用的AI助手来满足各类复杂需求。更严重的是一些独立GPTs显露出的安全隐患。除此之外&#xff0c;最大的问题在于OpenAI模糊不清的货币化政策。 文章正文 上周&#xff0c;不少人发现微软官网忽然更新了一条“GPT Bu…...

IOS Swift 从入门到精通:BlurEffect BlendMode stroke

文章目录 UIBlurEffectBlendModestroke基本用法:描边样式:与strokeBorder的区别:组合使用:自定义形状:UIBlurEffect 在Swift中,实现模糊效果通常是通过UIKit框架中的UIBlurEffect类来完成的,这通常被称作毛玻璃效果。 **创建UIBlurEffect实例:**选择一个模糊效果的样…...

西木科技Westwood-Robotics人型机器人Bruce配置和真机配置

西木科技Westwood-Robotics人型机器人Bruce配置和真机配置 本文内容机器人介绍Bruce机器人Gazebo中仿真代码部署Bruce真机代码部署 本文内容 人形机器人Brcue相关介绍docker中安装Gazebo并使用Bruce机器人控制器更换环境配置 机器人介绍 公司&#xff1a;西木科技Westwood-R…...

【招聘贴】JAVA后端·唯品会·BASE新加坡

作者|老夏&#xff08;题图&#xff1a;公司业务介绍页&#xff09; “ 请注意&#xff0c;这两个岗是BASE新加坡的&#xff0c;欢迎推荐给身边需要的朋友&#xff08;特别是在新加坡的&#xff09;。” VIP海外业务-产品技术团队&#xff0c;这两个岗位属于后端工程组的岗&…...

CVPR2024|vivo提出使用对抗微调获得泛化性更强的SAM,分割性能直接登顶 SOTA!

在计算机视觉不断发展的领域中&#xff0c;基础模型已成为一种关键工具&#xff0c;显示出对多种任务的出色适应性。其中&#xff0c;由 Meta AI 开发的 Segment Anything Model&#xff08;SAM&#xff09;在图像分割任务中表现杰出。然而&#xff0c;和其他类似模型一样&…...

程序员必备的ChatGPT技巧:从代码调试到项目管理

近年来&#xff0c;随着人工智能技术的迅猛发展&#xff0c;ChatGPT作为一种强大的对话式AI工具&#xff0c;已经广泛应用于各个领域。而对于程序员来说&#xff0c;ChatGPT不仅可以帮助他们解决编程中的各种问题&#xff0c;还能在项目管理中发挥重要作用。本篇博客将详细介绍…...

JAVA开发的一套医院绩效考核系统源码:KPI关键绩效指标的清晰归纳

KPI是关键绩效指标&#xff08;Key Performance Indicators&#xff09;的缩写&#xff0c;它是一种用于衡量员工或组织绩效的量化指标。这些指标通常与组织的目标和战略相关&#xff0c;并帮助管理层评估员工和组织的实际表现。KPI还可以为员工提供清晰的方向&#xff0c;使他…...

面向对象编程——python

目录 一、面向对象编程 1.1 类和对象 1.2 继承 1.3 封装 1.4 多态 1.5 Python中的面向对象编程 二、类、对象和变量 2.1 类&#xff08;Class&#xff09; 2.2.1 类的属性&#xff08;Class Attributes&#xff09; 2.2.2 类的方法&#xff08;Class Methods…...

【LeetCode】每日一题:合并K个升序链表

给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 解题思路 分治加两个链表合并&#xff0c;或者用根堆&#xff0c;根堆的初始化方法很值得背诵&#xff0c;还涉及lambda的用法 AC代码 # Defini…...

从零开始学docker(四)-安装mysql及主从配置(一)

mysql MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Database Management System&#xff0c;关…...

【目标检测】Yolov8 完整教程 | 检测 | 计算机视觉

学习资源&#xff1a;https://www.youtube.com/watch?vZ-65nqxUdl4 努力的小巴掌 记录计算机视觉学习道路上的所思所得。 1、准备图片images 收集数据网站&#xff1a;OPEN IMAGES 2、准备标签labels 网站&#xff1a;CVAT 有点是&#xff1a;支持直接导出yolo格式的标…...

新能源汽车 LabCar 测试系统方案(-)

什么是LabCar测试 LabCar测试目标是进行整车黄板台架功能测试&#xff0c;用于整车开发和测试阶段&#xff0c;满足设计人员和测试人员的试验需求&#xff0c;以验证整车性能&#xff0c;减少开发工作量。系统主要用于测试静态及动态工况下的纯电动汽车的各项功能实现情况。 …...

机器学习辅助的乙醇浓度检测(毕设节选)

目录 1.为什么要机器学习 2. 神经网络一般组成 3.BP神经网络工作过程 4.评价指标 5.实操代码 1.为什么要用机器学习 人工分析大量的谐振模式&#xff0c;建立各种WGM的响应与未知目标之间的关系&#xff0c;是一个很大的挑战。机器学习(ML)能够自行识别全谱的全部特征。作为…...

YOLO系列改进

yolo核心思想&#xff1a;把目标检测转变成一个回归问题。将整个图像作为网络的输入&#xff0c;仅仅经过一个神经网络&#xff0c;得到边界框的位置及其所属的类别。 YOLOv1 CVPR2016 输出7730的张量表示2个框的5个参数和20个种类。leaky ReLU&#xff0c;leaky并不会让负数…...

cuda与cudnn下载(tensorflow-gpu)

目录 前言 正文 前言 &#xff01;&#xff01;&#xff01;tensorflow-gpu的版本要与cuda与cudnn想对应。这点十分重要&#xff01;推荐下载较新的。即tensorflow-gpu2.60及以上&#xff0c;cuda11.x及以上&#xff0c;cudnn8.x及以上。 所以&#xff0c;下载之前先检查好…...

git 多分支实现上传文件但避免冲突检测

文章目录 背景实现步骤 背景 对于某些通过命令生成的配置文件&#xff08;如 TypeScript 类型文件等&#xff09; 实现步骤 1...

聊聊 golang 中 channel

1、引言 Do not communicate by sharing memory; instead, share memory by communicating Golang 的并发哲学是“不要通过共享内存进行通信&#xff0c;而要通过通信来共享内存”&#xff0c;提倡通过 channel 进行 goroutine 之间的数据传递和同步&#xff0c;而不是通过共享…...

SK Hynix 3D DRAM良率突破56.1%,开启存储新时代

根据韩国财经媒体Business Korea独家报道&#xff1a;在刚刚结束的VLSI 2024国际研讨会上&#xff0c;韩国半导体巨头SK Hynix公布了一项振奋人心的进展&#xff1a;其五层堆叠3D DRAM的制造良率已达到56.1%。此成果标志着3D DRAM技术在商业化道路上迈出了坚实的一步&#xff0…...

如何封装自动化测试框架?

封装自动化测试框架&#xff0c;测试人员不用关注框架的底层实现&#xff0c;根据指定的规则进行测试用例的创建、执行即可&#xff0c;这样就降低了自动化测试门槛&#xff0c;能解放出更多的人力去做更深入的测试工作。 本篇文章就来介绍下&#xff0c;如何封装自动化测试框…...

基于Java的在线编程考试系统【附源码】

毕业设计(论文) 题目&#xff1a;基于 二级学院&#xff1a; 现代技术学院 专业(方向)&#xff1a; 计算机应用技术 班 级&#xff1a; 计科B2015 学 生&#xff1a; 指导教师&#xff1a; 2024年1月 29 日 本科毕业论文&#xff08;设计&#xff09;学术诚信声明 本人郑重…...

Beautiful Soup的使用

1、Beautiful Soup简介 Beautiful Soup是一个Python的一个HTML或XML的解析库&#xff0c;我们用它可以方便地从网页中提取数据。 Beautiful Soup 提供一些简单的、Python 式的函数来处理导航、搜索、修改分析树等功能。它是一个工具箱&#xff0c;通过解析文档为用户提供需要抓…...

633. 平方数之和(中等)

633. 平方数之和 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java内存溢出溢出代码正确代码与截图 1. 题目描述 题目中转&#xff1a;633. 平方数之和 2.详细题解 本题是167. 两数之和 II - 输入有序数组&#xff08;中等&#xff09;题目的变型&#xff0c;由两数之和变…...

GIT回滚

1. 使用 git revert git revert 命令会创建一个新的提交&#xff0c;这个提交会撤销指定提交的更改。这通常用于公共分支&#xff08;如 main 或 master&#xff09;&#xff0c;因为它不会重写历史。 git revert HEAD # 撤销最近的提交 # 或者指定一个特定的提交哈希值 …...

BEVM基于OP-Stack发布首个以WBTC为GAS连接以太坊和比特币生态的中继链

为了更好的连接以太坊和比特币生态&#xff0c;BEVM团队正在基于OPtimism的OP Stack来构建一个以WBTC为GAS兼容OP-Rollup的中继链&#xff0c;这条中继链将作为一种完全去中心化的中间层&#xff0c;把以太坊上的主流资产(WBTC/ ETH/USDC/USDT等)引入到BEVM网络。 不仅如此&am…...

【vuejs】 $on、$once、$off、$emit 事件监听方法详解以及项目实战

1. Vue实例方法概述 1.1 vm.$on vm.$on是Vue实例用来监听自定义事件的方法。它允许开发者在Vue实例上注册事件监听器&#xff0c;当事件被触发时&#xff0c;指定的回调函数会被执行。 事件监听&#xff1a;vm.$on允许开发者绑定一个或多个事件到Vue实例上&#xff0c;并且可…...

如何下载植物大战僵尸杂交版,最全攻略来了

《植物大战僵尸杂交版》由热爱原版游戏的B站UP主“潜艇伟伟迷”独立开发&#xff0c;带来了创新的游戏体验。如果你是策略游戏的爱好者&#xff0c;下面这份全面的下载和游玩攻略将是你的理想选择。 游戏亮点&#xff1a; 杂交植物系统&#xff1a;结合不同植物特性&#xff0c…...

小公司全栈是归宿吗?

在软件开发领域&#xff0c;特别是在小公司或初创公司中&#xff0c;全栈开发者的角色确实相对普遍和重要。然而&#xff0c;说“全栈是归宿”可能过于绝对&#xff0c;因为每个开发者的职业路径和兴趣点都是不同的。 以下是关于全栈开发在小公司的一些考虑&#xff1a; 需求…...

对https://registry.npm.taobao.org/tyarn的请求失败,原因:证书过期

今天安装yarn时&#xff0c;报错如下&#xff1a; request to https://registry.npm.taobao.org/yarn failed, reason: certificate has expired 原来淘宝镜像过期了&#xff0c;需要重新搞一下 记录一下解决过程&#xff1a; 1.查看当前npm配置 npm config list 2.清…...