React七Formik
Formik是一个专为React构建的开源表单库。它提供了一个易于使用的API来处理表单状态管理,表单验证以及表单提交。Formik支持React中的所有表单元素和事件,可以很好地与React生态系统中的其他库集成。同时,Formik还提供了一些高级功能,如支持异步验证、字段级别的验证、根据表单状态变化自动计算属性等。
Formik 基础
Formik的优势,相较于传统的表单处理方法,Formik具有以下优势:
- 状态管理: Formik自动地处理表单状态管理,无需手动编写大量的状态管理逻辑。
- 表单验证: Formik提供了易于使用的表单验证工具,可以快速实现表单验证逻辑。
- 表单提交: Formik可以方便地处理表单提交,包括异步表单提交和重试机制。
- 支持复杂表单: Formik支持处理包括多级嵌套、动态表单、数组表单等多种复杂表单。
Formik 安装和简单使用
1、Formik安装,使用npm或yarn安装Formik。在终端中,切换项目目录并运行此命令 npm install formik
或 yarn add formik
。
2、表单数据绑定以及提交处理
useFormik HOOK 参数说明:
- initialValues:传递定义的输入HTML元素的name属性相匹配的初始值
- onSubmit:提交程序,已经默认阻止了默认行为
onSubmit 属性定义了一个回调函数,在表单提交时被调用。在回调函数中可以访问表单中所有输入框的值并执行提交操作,通过 setSubmitting 函数,可以设置表单的提交状态。在表单的渲染函数中通过 handleSubmit 属性来处理表单的提交,使用 isSubmitting(默认false) 属性来禁用提交按钮,直到表单提交完成。
const formik = useFormik({initialValues: {username: '',password: ''},onSubmit: (values, {setSubmitting}) => {// formik 已经默认帮我们阻止了默认执行console.log('values: ', values);setSubmitting(true)}})……<form onSubmit={formik.handleSubmit}><div><label htmlFor="username">用户名:</label><input id="username" type="text" name="username" value={formik.values.username} onChange={formik.handleChange}></input></div><div><label htmlFor="password">密码:</label><input id="password" type="password" name="password" value={formik.values.password} onChange={formik.handleChange}></input></div><button type="submit" disabled={formik.isSubmitting}>提交</button></form>
useFormik 返回对象属性解释:
- handleSubmit:提交处理程序
- handleChange:传递给每个
<input>
、<select>
、 或<textarea>
的更改处理程序 - values:表单的当前值,使用 name 访问对应的值
- handleChange:每个 HTML 输入重用相同的更改处理函数
- setValues和setFieldValue:setValues设置formik的values属性值,setFieldValue设置values的某一个属性值,二者写法不同,但是目的一样改变values的值。
如果没有 formik,那么就得一个个写change事件。
3、表单校验
Formik 不仅跟踪表单values,还跟踪其验证和错误消息。要使用 JS 添加验证,需指定一个自定义验证函数并将其传递给钩子 useFormik()
的参数 validate。如果存在错误,这个自定义验证函数应该生成一个匹配的error对象。
validate: values => {const errors = {}if (!values.username) {errors.username = '请输入用户名'} else if (values.username.length < 6 || values.username.length > 16) {errors.username = '请输入6~16位的用户名'} else if (!/^\w{6,16}$/.test(values.username)) {errors.username = '请输入由字母、数字、下划线组成的用户名'}if (!values.password) {errors.password = '请输入密码'} else if (values.password.length < 6 || values.password.length > 16) {errors.password = '请输入6~16位的密码'} else if (!/^\w{6,16}$/.test(values.password)) {errors.password = '请输入由字母、数字、下划线组成的密码'}console.log('errors: ', errors);return errors}
默认情况下,Formik 将在每次击键(onChange)事件以及提交之前进行验证。传递 formik.handleBlur
给输入元素的 onBlur
属性,那么会在输入元素的失焦(onBlur)事件中进行验证:
<input id="username" type="text" name="username" value={formik.values.username} onChange={formik.handleChange} onBlur={formik.handleBlur}></input>
校验确实实现了,但是如果希望在提交表单的时候再显示错误,需要怎么做呢?
Formik 会跟踪哪些字段已被访问过。它将这些信息存储在一个名为 touched 的对象中,这些值为boolean值。
<p>{formik.touched.username && formik.errors.username ? formik.errors.username : ''}</p>
Formik 结合 Yup 进行表单验证
Yup是一个构建对象模式的JavaScript模式验证器,用于验证和解析数据。它提供了一种声明式方法来创建校验模式。
由于 Formik 作者/用户非常喜欢Yup,因此 Formik 有一个名为 Yup 的特殊配置道具validationSchema,它会自动将 Yup 的验证错误消息转换为一对象。
1、Yup 安装 npm install yup
或 yarn add yup
2、使用 Yup 校验表单:
- Formik 结合 Yup 可以轻松实现表单验证
validationSchema={Yup.object({...})}
,使用 validationSchema 和 Yup 搭配之后就不需要再使用validate配置了。 - Yup 允许创建复杂的校验逻辑,如必填项、字符长度、正则表达式等。
validationSchema: Yup.object({username: Yup.string().required('请输入用户名').min(6, '请输入6~16位的用户名').max(16, '请输入6~16位的用户名').matches(/^\w{6,16}$/, '请输入由字母、数字、下划线组成的用户名'), password: Yup.string().required('请输入密码').min(6, '请输入6~16位的密码').max(16, '请输入6~16位的密码').matches(/^\w{6,16}$/, '请输入由字母、数字、下划线组成的密码')})
Formik 组件
以上都是通过 useFormik 拿到控制formik表单的内容,但是这样不容易形成封装,也就是说无法进行实例传值。而Formik由于配备了React Context,因此Formik本身就可以管理所包裹的JSX。
formik完全遵守React的组件化原则,可以和其他库或自定义逻辑无缝集成:
- formik支持构建和复用表单组件,通过
<Formik />
组件和Context API实现跨组件通信。 - 可以创建包装
<Field />
、ErrorMessage
等的自定义组件,提高代码复用性和可维护性。
<Formik initialValues={{username: '', password: ''}} // 设置初始化值onSubmit={(values, {setSubmitting}) => { // 提交表单执行的函数setTimeout(() => {console.log('values: ', values); setSubmitting(true)}, 2000);}}validationSchema={Yup.object({ // 设置表单校验的模式username: Yup.string().required('请输入用户名').min(6, '请输入6~16位的用户名').max(16, '请输入6~16位的用户名').matches(/^\w{6,16}$/, '请输入由字母、数字、下划线组成的用户名'), password: Yup.string().required('请输入密码').min(6, '请输入6~16位的密码').max(16, '请输入6~16位的密码').matches(/^\w{6,16}$/, '请输入由字母、数字、下划线组成的密码')})}>{({handleSubmit, values, touched, handleChange, handleBlur, errors, isSubmitting}) => {return <form onSubmit={handleSubmit}><div><label htmlFor="username1">用户名:</label>{/* <input id="username1" type="text" name="username" value={values.username} onChange={handleChange} onBlur={handleBlur}></input> */}<Field id='username1' name='username' type='text'></Field>{/* <p>{touched.username && errors.username ? errors.username : ''}</p> */}<ErrorMessage name="username"></ErrorMessage></div><div><label htmlFor="password1">密码:</label><input id="password1" type="password" name="password" value={values.password} onChange={handleChange}></input><p>{touched.password && errors.password ? errors.password : ''}</p></div><button type="submit" disabled={isSubmitting}>提交</button></form>}}</Formik>
常用组件
1、ErrorMessage 捕捉错误的容器,必传一个name属性。
<ErrorMessage name="username"></ErrorMessage>
2、Field 将自动将输入连接到 Formik,默认渲染是input输入框,有以下几种方法渲染:
function MyField({field, form}) {console.log('field: ', field);console.log('form: ', form);return <input {...field}></input>}……<Formik initialValues={{email: '', project: 2, phone: '', address: '1'}} // 设置初始化值onSubmit={(values) => { console.log('values: ', values); }} // 提交表单执行的函数validationSchema={Yup.object({ // 设置表单校验的模式phone: Yup.string().required('请输入电话号码').matches(/^1[0-9]{10}/, '请输入有效的电话号码')})}>{({handleSubmit}) => {return <form onSubmit={handleSubmit}>{/* 1、直接渲染 */}<Field type='email' name='email' placeholder='请输入电子邮箱'></Field> <br/>{/* 2、as 转化成其他节点 */}<Field as='select' name='project'><option value={1}>数学及应用数学</option><option value={2}>软件工程</option><option value={3}>国际贸易</option></Field> <br/>{/* 3、渲染 jsx */}<Field name='phone'>{({field, form, meta}) => {console.log('field: ', field);console.log('form: ', form);console.log('meta: ', meta);return <div><label htmlFor="phone">电话号码</label><input id="phone" type="text" placeholder="请输入电话号码" value={field.value.phone} {...field}></input><p>{ meta.touched && meta.error ? meta.error : ''}</p></div>}}</Field>{/* 4、以 component 组件形式渲染 */}<Field name='address' component={MyField}></Field> <br /><button type="submit">提交</button></form>}}</Formik>
数组和对象校验
Formik 支持嵌套对象和数组:
- yup 对象校验使用
Yup.object({})
- yup 数组校验使用
Yup.array().of()
<FormikinitialValues={{social: {wechat: '', qq: ''}, frends: ['', '']}}onSubmit={(values, {setSubmitting}) => {console.log('values: ', values)setSubmitting(true)}} validationSchema={Yup.object({social: Yup.object({wechat: Yup.string().required('请输入微信'), qq: Yup.string().required('请输入QQ').matches(/^[\w]$/, '请输入有效的QQ')}),frends: Yup.array().of(Yup.string().required('请输入你的朋友'))})}>{({values, handleChange, handleBlur, touched, errors, isSubmitting, setValues, setFieldValue}) => {console.log('object array values: ', values);console.log('object array handleChange: ', handleChange);console.log('object array handleBlur: ', handleBlur);console.log('object array touched: ', touched);console.log('object array errors: ', errors);console.log('object array setValues: ', setValues);console.log('object array setFieldValue: ', setFieldValue);return <form><h4>社交账号</h4><label>微信:</label><input name="social.wechat" value={values.social.wechat} onChange={handleChange} onBlur={handleBlur}></input><p>{ touched.social && errors.social && touched.social.wechat && errors.social.wechat ? errors.social.wechat : ''}</p><br /><label>QQ:</label><input name="social.qq" value={values.social.qq} onChange={handleChange} onBlur={handleBlur}></input><h4>朋友</h4>{values.frends.map((v, i) => {return (<div key={i}><input name={`friends[${i}]`} onChange={handleChange} onBlur={handleBlur}></input>{i < values.frends.length && <br />}</div>)})}<button type="submit" disabled={isSubmitting}>提交</button></form>}}</Formik>
相关文章:
React七Formik
Formik是一个专为React构建的开源表单库。它提供了一个易于使用的API来处理表单状态管理,表单验证以及表单提交。Formik支持React中的所有表单元素和事件,可以很好地与React生态系统中的其他库集成。同时,Formik还提供了一些高级功能…...
5分钟使用Docker部署Paint Board快速打造专属在线画板应用
文章目录 前言1.关于Paint Board2.本地部署paint-board3.使用Paint Board4.cpolar内网穿透工具安装5.创建远程连接公网地址6.固定Paint Board公网地址 💡 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住…...
可狱可囚的爬虫系列课程 14:10 秒钟编写一个 requests 爬虫
一、前言 当重复性的工作频繁发生时,各种奇奇怪怪提高效率的想法就开始萌芽了。当重复代码的模块化封装已经不能满足要求的时候,更高效的方式就被揭开了神秘的面纱。本文基于这样的想法,来和大家探讨如何 10 秒钟编写一个 requests 爬虫程序。…...
【深度学习神经网络学习笔记(三)】向量化编程
向量化编程 向量化编程前言1、向量化编程2、向量化优势3、正向传播和反向传播 向量化编程 前言 向量化编程是一种利用专门的指令集或并行算法来提高数据处理效率的技术,尤其在科学计算、数据分析和机器学习领域中非常常见。它允许通过一次操作处理整个数组或矩阵的…...
PHP入门基础学习四(PHP基本语法)
运算符 运算符,专门用于告诉程序执行特定运算或逻辑操作的符号。根据运算符的作用,可以将PHP语言中常见的运算符分为9类 算数运算符: 是用来处理加减乘除运算的符号 也是最简单和最常用的运算符号 赋值运算符 1. 是一个二元运算符&#x…...
【十二】Golang 映射
💢欢迎来到张胤尘的开源技术站 💥开源如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 映射映射的定义映射初始化make 函数使用字面量 源…...
简单理解Oracle中的latch
可以用一个小卖部抢购的例子来理解 Oracle 数据库中的 Latch: 1、 什么是 Latch? 打个比方,假设数据库的某个内存区域(比如缓存的数据块)是小卖部货架上的最后一包辣条,Latch 就像是货架前的一个狭窄通道&a…...
hbase集群部署
1.hbase集群的搭建(以及内部逻辑) 虽然Hmaster有多个,但是属于热备,起作用的就active上的这个。 部署流程: 因为我配置的hadoop是一个非HA的,所以修改为以下 如果是HA的hadoop一定要做以下这一步。 在启动…...
塔能物联运维保障智慧地下停车场安全与高效
一、智慧地下停车场安全在城市升级改造中的关键地位 随着城市的不断发展和升级改造,智慧地下停车场的重要性日益凸显。在现代城市中,土地资源愈发珍贵,地下停车场成为解决停车难题的关键设施。然而,停车场的安全问题是其正常运行和…...
面试八股文--数据库基础知识总结(2) MySQL
本文介绍关于MySQL的相关面试知识 一、关系型数据库 1、定义 关系型数据库(Relational Database)是一种基于关系模型的数据库管理系统(DBMS),它将数据存储在表格(表)中,并通过表格…...
深入理解指针2
深入理解指针2 数组名的理解 数组名就是首元素的地址 int arr[]{1,3,2}; printf("%p\n",arr); printf("%p\n",&arr[0]);但是有两种情况除外, 1.sizeof(数组名),sizeof操作符统计的是整个数组的大小,并不是第一个元素…...
QT各种版本下载安装
参考链接: 【Qt】超详细!Qt4.8.6和VS2010的配置及使用 由于QT官网一般现在进不去,所以下载一些QT版本只能通过镜像或者以前下载存储的安装包来进行,现在推荐两种方法 从参考链接中搬过来: 方案一:国内镜…...
java进阶学习脑图
今天开始分享我的第一篇博客,先放上我自己花费一个月完成的java进阶学习脑图吧! 谁都想像R大一样对JVM可以知无不言,言无不尽; 谁都想像Doug Lea一样可以参与JUC这种核心模块的开发; 但是,不能只停留在想…...
Spring 原始注解详解与实战指南
📝 1. 前言 在 Spring 框架的发展过程中,注解的引入大大简化了配置,提升了开发效率 本文将详细介绍 Spring 最初引入的核心注解,包括 Component、Controller、Service、Repository、Autowired、Qualifier 和 Value 等,…...
uniapp封装请求
在uniapp中封装HTTP请求,通常我们会使用uni.request方法。uni.request是uni-app提供的一个网络请求API,可以用来发送各种类型的HTTP请求(GET、POST、PUT、DELETE等)。下面是如何在uniapp中封装一个通用的HTTP请求方法,…...
YOLOv10 解析与地平线 征程 6 模型量化
一,YOLOv10 解析 1.简介 近些年来,研究人员对 YOLO 的架构设计、优化目标、数据增强策略等进行了探索,取得了显著进展。然而,后处理对非极大值抑制(NMS)的依赖阻碍了 YOLO 的端到端部署,并对推…...
基本网络安全的实现
基本网络安全的实现 一 :AAA AAA 是Authentication,Authorization and Accounting(认证、授权和计费)的简 称,它提供了一个用来对认证、授权和计费这三种安全功能进行配置的一致性框架, 它是对网络安全…...
ROS2 强化学习:案例与代码实战
一、引言 在机器人技术不断发展的今天,强化学习(RL)作为一种强大的机器学习范式,为机器人的智能决策和自主控制提供了新的途径。ROS2(Robot Operating System 2)作为新一代机器人操作系统,具有…...
Java数据结构第十四期:走进二叉树的奇妙世界(三)
专栏:数据结构(Java版) 个人主页:手握风云 目录 一、二叉树OJ练习题 1.1. 相同的树 1.2. 另一棵树的子树 1.3. 翻转二叉树 1.4. 平衡二叉树 1.5. 对称二叉树 一、二叉树OJ练习题 1.1. 相同的树 判断两棵树是否相同,我们是否只能遍历一…...
GO 进行编译时插桩,实现零码注入
Go 编译时插桩 Go 语言的编译时插桩是一种在编译阶段自动注入监控代码的技术,目的是在不修改业务代码的情况下,实现对应用程序的监控和追踪。 基本原理 Go 编译时插桩的核心思想是通过在编译过程中对源代码进行分析和修改,将监控代码注入到…...
《炎龙骑士团 1 邪神之封印》游戏信息
发行公司:1994 年由汉堂国际资讯公司发行。 游戏类型:回合制角色扮演游戏 故事背景 远古之战:在远古时代,圣族与魔族爆发大战,魔族领导者大邪神力量强大,圣族处于下风。圣族派出十二战士突袭,虽…...
本地大模型编程实战(23)用智能体(Agent)实现基于SQL数据构建问答系统(2)
本文将用 智能体(Agent) 实现对 SQLite 数据库的查询:用户用自然语言提出问题,智能体也用自然语言根据数据库的查询结果回答问题。 本次将分别在英文、中文环境下,使用 qwen2.5 、 MFDoom/deepseek-r1-tool-calling:7b 以及 llama3.1 做实验。…...
Flash-03
1-问题:Flash软件画两个图形,若有部分重合则变为一个整体 解决方法1:两个图形分属于不同的图层 解决方法2:将每个图形都转化为【元件】 问题2:元件是什么? 在 Adobe Flash(现在称为 Adobe Anim…...
防火墙双机热备---VRRP,VGMP,HRP(超详细)
双机热备技术-----VRRP,VGMP,HRP三个组成 注:与路由器VRRP有所不同,路由器是通过控制开销值控制数据包流通方向 防火墙双机热备: 1.主备备份模式 双机热备最大的特点就是防火墙提供了一条专门的备份通道(心…...
PC端-发票真伪查验系统-Node.js全国发票查询接口
在现代企业的财务管理中,发票真伪的验证至关重要。随着电子发票的普及,假发票问题日益严峻,如何高效、准确的对发票进行真伪查验,已经成为各类企业在日常运营中必须解决的关键问题。翔云发票查验接口做企业财务管理、税务合规的好…...
3.1部署filebeat:5044
beats是ELK体系中新增的一个工具,, 属于一个轻量的日志采集器。 1.安装(每台) # tar xf filebeat-6.4.1-linux-x86_64.tar.gz # mv filebeat-6.4.1-linux-x86_64 /usr/local/filebeat #yum -y install httpd #systemctl start httpd 2.测试…...
在 Windows 上配置 Ollama 服务并开放局域网访问
为了在局域网内共享 Ollama 服务,我们需要完成以下两步: 1、设置 Ollama 的环境变量 OLLAMA_HOST,使其监听局域网的 IP 地址。 (1) 配置 Ollama 服务的监听地址 Ollama 服务使用环境变量 OLLAMA_HOST 来指定监听的地…...
C#快速调用DeepSeek接口,winform接入DeepSeek查询资料 C#零门槛接入DeepSeek C#接入DeepSeek源代码下载
下载地址<------完整源码 在数字化转型加速的背景下,企业应用系统对智能服务的需求日益增长。DeepSeek作为先进的人工智能服务平台,其自然语言处理、图像识别等核心能力可显著提升业务系统的智能化水平。传统开发模式下,C#开发者需要耗费大…...
解决后端跨域问题
目录 一、什么是跨域问题? 1、跨域问题的定义 2、举例 3、为什么会有跨域问题的存在? 二、解决跨域问题 1、新建配置类 2、编写代码 三、结语 一、什么是跨域问题? 1、跨域问题的定义 跨域问题(Cross-Origin Resource Sh…...
【教程】使用docker+Dify搭建一个本地知识库
现在AI火的一塌糊涂,再不搭建一个自己的AI知识库就有点落伍了,这里我是自己的windows11电脑。用了dockerdifydeepseek。 一、安装docker 网址:https://www.docker.com/ 什么是docker? Docker 是一种开放源代码的容器化平台&…...
微信小程序数据绑定与事件处理:打造动态交互体验
在上一篇中,我们学习了如何搭建微信小程序的开发环境并创建了一个简单的“Hello World”页面。然而,一个真正的小程序不仅仅是静态内容的展示,它需要与用户进行动态交互。本文将深入探讨微信小程序中的数据绑定和事件处理机制,通过…...
Spring MVC 的执行流程解析:从用户请求到响应返回
Spring MVC 是一种基于 Model-View-Controller 设计模式的 Web 框架,用于处理用户请求、执行相应的业务逻辑并返回响应。它广泛应用于 Java Web 开发,提供了灵活的架构和丰富的功能。 本文将详细介绍 Spring MVC 的执行流程,帮助你理解它是如…...
c++day5
作业: 编写一个如下场景: 有一个英雄Hero类,私有成员,攻击,防御,速度,生命值,以及所有的set get 方法 编写一个 武器 Weapon 类,拥有私有成员攻击力,以及set …...
Deepseek 实战全攻略,领航科技应用的深度探索之旅
想玩转 Deepseek?这攻略别错过!先带你了解它的基本原理,教你搭建运行环境。接着给出自然语言处理、智能客服等应用场景的实操方法与代码。还分享模型微调、优化技巧,结合案例加深理解,让你全面掌握,探索科技…...
公共数据授权运营模式研究(总体框架、主要模式及发展趋势)
本报告以公共数据运营模式为核心,以释放公共数据价值为目标,深入分析公共数据概念及特征,厘清公共数据运营的内涵及本质,提出纵深分域数据要素市场运营体系的总体思路,构建了一座(一个数据底座)…...
本地开发用ASP.NET Core Web API项目创建及测试
1. 服务端代码(C#) 1.1 创建ASP.NET Core Web API项目 打开Visual Studio 2022。 选择“创建新项目”。 选择“ASP.NET Core Web API”模板,点击“下一步”。 输入项目名称(如OracleApi),选择项目位置&…...
【虚拟仪器技术】labview操作指南和虚拟仪器技术习题答案(一)
今天是2025年2月24日,画的是fate/Grand Order里面的阿尔托莉雅.卡斯特,武内老师的画。 目录 第1章 第2章 第3章 第4章 第5章 关注作者了解更多 我的其他CSDN专栏 毕业设计 求职面试 大学英语 过程控制系统 工程测试技术 虚拟仪器技术 可编程…...
SpringCloud系列教程:微服务的未来(二十五)-基于注解的声明队列交换机、消息转换器、业务改造
前言 在现代分布式系统中,消息队列是实现服务解耦和异步处理的关键组件。Spring框架提供了强大的支持,使得与消息队列(如RabbitMQ、Kafka等)的集成变得更加便捷和灵活。本文将深入探讨如何利用Spring的注解驱动方式来配置和管理队…...
LLM之论文阅读——Context Size对RAG的影响
前言 RAG 系统已经在多个行业中得到广泛应用,尤其是在企业内部文档查询等场景中。尽管 RAG 系统的应用日益广泛,关于其最佳配置的研究却相对缺乏,特别是在上下文大小、基础 LLM 选择以及检索方法等方面。 论文原文: On the Influence of Co…...
C#实现本地AI聊天功能(Deepseek R1及其他模型)。
前言 1、C#实现本地AI聊天功能 WPFOllamaSharpe实现本地聊天功能,可以选择使用Deepseek 及其他模型。 2、此程序默认你已经安装好了Ollama。 在运行前需要线安装好Ollama,如何安装请自行搜索 Ollama下载地址: https://ollama.org.cn Ollama模型下载地址…...
git 查询包含某个文件夹的步骤
步骤 1:拉取最新的远程分支信息 确保本地缓存的远程分支信息是最新的: bash 复制 git fetch --all 步骤 2:遍历所有远程分支并检查目标文件夹 使用 git ls-tree 检查每个分支是否包含目标文件夹。以下脚本会列出所有包含 your_folder_pa…...
微软开源神器OmniParser-v2.0本地部署教程
安装python环境 我这里是以前安装好的版本:python 3.11.5,这里不再介绍,有需要的可以在网上找教程。 安装Anaconda 我这里是以前安装好的版本:conda 23.7.4,这里也不再介绍,有需要的可以在网上找教程。 …...
解决 Git 合并冲突:当本地修改与远程提交冲突时
目录 错误原因分析 解决方法 1. 暂存本地修改并合并(保留更改) 2. 丢弃本地修改(强制覆盖) 3. 暂存修改后合并(推荐:使用 git stash) 4. 选择性合并(手动处理冲突文件…...
VScode中Markdown PDF无法正确输出包含数学公式的pdf解决方案
在使用VScode的Markdown PDF插件时,可能会遇到无法正确输出包含公式的PDF文件的问题。下面为你提供一种有效的解决方案。 具体操作步骤 步骤一:定位模板文件 在安装Markdown PDF插件后,你需要找到对应的模板文件。该文件的路径通常如下&am…...
uniapp 网络请求封装(uni.request 与 uView-Plus)
一、背景 在开发项目中,需要经常与后端服务器进行交互;为了提高开发效率和代码维护性,以及降低重复性代码,便对网络请求进行封装统一管理。 二、创建环境文件 2.1、根目录新建utils文件夹,utils文件夹内新建env.js文…...
Jtti.cc:站群服务器SEO优化建议,如何分配多IP?
站群优化的核心目标之一是尽可能通过多个网站互相引导流量,从而提升主站的权重。这时候,多IP的分配至关重要,因为搜索引擎会检测到同一IP下的网站之间的关联性。如果一个IP地址下有过多的相似站点,搜索引擎可能会认为这些站点存在…...
银行系统功能架构设计元模型
1. 元模型核心目标 规范性:定义功能模块的标准化描述方式,便于跨团队协作。可复用性:抽象通用组件,减少重复开发。可扩展性:支持未来业务创新和技术升级(如开放银行API集成)。2. 元模型层级结构 采用分层架构模式,分为以下核心层级: **(1) 业务功能层** …...
uniapp写的h5跳转小程序
使用场景: 我们对接第三方支付的时候,对方只提供了原生小程序id和appid,由我们的app和h5平台跳转至小程序。 遇到的问题: app跳转本地正常,线上报错如下 解决办法: 需要去微信开放平台申请应用appid 易…...
DeepSeek点燃AI大模型战火:编程语言争霸,谁将问鼎“终极武器”王座?
DeepSeek点燃AI大模型战火:编程语言争霸,谁将问鼎“终极武器”王座? 一、DeepSeek:AI大模型竞赛的“导火索” 2023年,中国AI公司深度求索(DeepSeek)发布DeepSeek-R1大模型,凭借其超…...
游戏引擎学习第123天
仓库:https://gitee.com/mrxiao_com/2d_game_3 黑板:线程同步/通信 目标是从零开始编写一个完整的游戏。我们不使用引擎,也不依赖任何库,完全自己编写游戏所需的所有代码。我们做这个节目不仅是为了教育目的,同时也是因为编程本…...