【实战】React 必会第三方插件 —— Cron 表达式生成器(qnn-react-cron)

news2024/11/17 23:29:40

文章目录

  • 一、引子
  • 二、配置使用
    • 1.安装
    • 2.使用
      • (1)直接调用
      • (2)赋值到表单(Form)
      • (3)自定义功能按钮
      • (4)隐藏指定 Tab
      • (5)其他
  • 三、常见问题及解决
    • 1.兼容低版本 antd 或高版本 react
    • 2.useForm 相关报错
    • 3.setState inside useEffect 死循环
  • 四、拓展学习
    • 1.cron表达式翻译 —— cronstrue
    • 2.其他 cron 相关 npm 库(包含 vue 相关)
      • react-cron-generator
      • vue:vcrontab
      • vue-cron-2
    • 3.在线工具


一、引子

Cron 表达式相关知识详见:【实战】Linux基础知识必学 —— 定时任务


qnn-react-cron 可以看做 react-cron-antd 的升级版(具体“渊源”可见文档),现有功能如下:

  • 🎉 全面支持 cron:秒、分、时、日、月、周、年
  • 🎉 日及周条件互斥,自动改变响应值
  • 🎉 支持反解析 cron 表达式到 UI
  • 🎉 可结合此组件与 Antd 的下拉及输入组件封装成下拉输入框
  • 🎉 国际化支持
  • 🎉 TypeScript 支持

直到现在作者依旧在维护(这篇文章之前最新库更新日期:2023.03.02)

  • npm:https://www.npmjs.com/package/qnn-react-cron
  • github: https://github.com/wangzongming/qnn-react-cron
    .

在这里插入图片描述

二、配置使用

1.安装

yarn add qnn-react-cron | npm i qnn-react-cron

这一步遇到依赖不兼容问题可见后面内容:<三、常见问题及解决>

2.使用

  • 引用:
import React from "react";
import Cron from "qnn-react-cron";

(1)直接调用

<Cron />

啊哈,有点简单,这样只能显示,进行被隔离的操作,若要与页面其他组件联动,接着往下看。

  • 默认生成表达式并赋值到变量:
import React, { useState } from "react";
import Cron from "qnn-react-cron";

export default () => {
	const [cronValue, setCronValue] = useState('')
	
	return <Cron
		value={cronValue}
		onOk={setCronValue}
	/>
}

<Cron onOk={setCronValue}/><Cron onOk={value => setCronValue(value)}/> 的简写

(2)赋值到表单(Form)

或是使用了表单(Form),比如需要将表达式赋值到 input 框中:

import React from "react";
import Cron from "qnn-react-cron";

export default () => {
	const { getFieldValue, setFieldsValue } = props.form

	return <Cron
		value={getFieldValue('cronValue')}
		onOk={value => setFieldsValue({ cronValue: value})}
	/>
}

这样点击 生成 按钮即可赋值到 input 框中,在 input 框中修改也能同步到组件中。

(3)自定义功能按钮

但是组件默认带了两个按钮:解析到UI生成,要想隐藏 解析到UI 按钮只能将两个按钮全部都走自定义(有其他想要的功能,比如 重置 也能使用下面的自定义按钮):

import React, { useState } from "react";
import { Button } from "antd";
import Cron from "qnn-react-cron";

export default () => {
	const { getFieldValue, setFieldsValue } = props.form
	const [fns, setFns] = useState({})
	return <Cron
		value={getFieldValue('cronValue')}
		// 相当于 ref
        getCronFns={setFns}
		// 自定义底部按钮后需要自行调用方法来或者值
        footer={[
            //默认值
            <Button style={{ marginRight: 10 }} onClick={()=>fns.onParse()}>解析到UI</Button>
            <Button type="primary"  onClick={()=>setFieldsValue({ cronValue: fns.getValue()}))}>生成</Button>
        ]}
	/>
}

若是组件用在模态框(Modal)中,组件和模态框在右下方都有按钮,可以隐藏默认按钮并将按钮功能(解析到UI、生成)提取到其他地方,比如输入框(Input)的右侧:

import Cron from "qnn-react-cron";
import { Form, Input, Button } from "antd"
// import { useState } from "react";

const CronIndex = () => {
	// const [cronRef, setCronRef] = useState()
  let cronRef
  const [ form ] = Form.useForm()
  const { getFieldValue, setFieldsValue } = form

  return <Form form={form}>
    <Form.Item label="任务周期" name="cronValue">
      <Input addonAfter={( 
        <Button
          type='primary'
          style={{ margin: '-1px -12px', border: 'none' }}
          onClick={() => setFieldsValue({ cronValue: cronRef.getValue() })}>生成</Button>
      )}/>
    </Form.Item>
    <Cron
      value={getFieldValue('cronValue')}
      getCronFns={fns => cronRef = fns}
      // getCronFns={setCronRef}
      footer={[]}
    />
  </Form>
}

export default CronIndex

此时效果:<输入框> 实时同步 到<组件>,<组件>中变化在点击生成按钮时同步到<输入框>,如图:

在这里插入图片描述

getCronFns 中对于 cronRef 值的获取不建议使用 useState(代码中有相关示例,已注释掉,感兴趣的可以尝试一下) ,会引起报错:Warning: Maximum update depth exceeded. This can happen when a component calls setState inside useEffect, but useEffect either doesn’t have a dependency array, or one of the dependencies changes on every render.

(4)隐藏指定 Tab

  • 配置面板的隐藏与显示,默认如下:
<Cron
    // 配置面板的隐藏, false 即隐藏
    panesShow={{
        second: true,
        minute:true,
        hour: true,
        day: true,
        month:true,
        week:true,
        year:true,
    }}
    // 默认显示哪个面板, 默认为 second, 如果隐藏了 second 需要自行设置
    defaultTab={"second"}
/>

隐藏秒,默认显示分钟的设置,如下:

<Cron panesShow={{ second: false }} defaultTab={"minute"} />

默认值是:* * * * * ? *,因此在隐藏某个面板时,要做好对该部分隐藏值的处理

(5)其他

  • 博主这里没有用到<语言国际化配置>,如有需要请参考文末官方文档

三、常见问题及解决

1.兼容低版本 antd 或高版本 react

博主在记录这篇博文时,安装的版本是:qnn-react-cron@1.0.4,所支持主要依赖版本:

  • antd@“^4.5.2”
  • react@“^15.0.0 || ^16.0.0 || ^17.0.0”

若是项目时用的还是比较老的 antd 版本,或是 react 版本高于 qnn-react-cron 所依赖版本在安装依赖时会发生如下报错:

npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR! 
npm ERR! While resolving: npm-test@0.1.0
npm ERR! Found: react@18.2.0
npm ERR! node_modules/react
npm ERR!   react@"^18.2.0" from the root project
npm ERR!   peer react@">=16.9.0" from antd@4.24.8        
npm ERR!   node_modules/antd
npm ERR!     peer antd@"^4.5.2" from qnn-react-cron@1.0.4
npm ERR!     node_modules/qnn-react-cron
npm ERR!       qnn-react-cron@"*" from the root project  
npm ERR!   1 more (react-dom)
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer react@"^15.0.0 || ^16.0.0 || ^17.0.0" from qnn-react-cron@1.0.4
npm ERR! node_modules/qnn-react-cron
npm ERR!   qnn-react-cron@"*" from the root project
npm ERR!
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.
npm ERR!
...

不要慌,解决办法就在报错日志中(顺便学习英语了,嘻嘻):

  • 关键词:peer(匹配的,对等的);
  • 关键句:Fix the upstream dependency conflict, or retry(修复上游依赖冲突,或重试)
  • 原因:npm 7.x 之前的版本遇到依赖冲突会忽视依赖冲突,继续进行安装;npm 7.x 版本开始不会自动进行忽略,需要用户手动输入命令,两种选择:
    • –force 无视冲突,强制获取远端npm库资源 (覆盖之前)
    • –legacy-peer-deps 忽视依赖冲突,继续安装(不覆盖之前)
npm install vue-router --force
或者
npm install vue-router --legacy-peer-deps

2.useForm 相关报错

参见:【已解决】Instance created by useForm is not connected to any Form element. Forget to pass form prop

3.setState inside useEffect 死循环

Warning: Maximum update depth exceeded. This can happen when a component calls setState inside useEffect, but useEffect either doesn’t have a dependency array, or one of the dependencies changes on every render.

详见二.2.(3)案例或:博主在大佬提的issues下再次提问:https://github.com/wangzongming/qnn-react-cron/issues/21

四、拓展学习

1.cron表达式翻译 —— cronstrue

  • npm:https://www.npmjs.com/package/cronstrue

2.其他 cron 相关 npm 库(包含 vue 相关)

react-cron-generator

  • npm:https://www.npmjs.com/package/react-cron-generator
  • demo:https://sojinantony01.github.io/react-cron-generator/
    在这里插入图片描述

vue:vcrontab

  • npm:https://www.npmjs.com/package/vcrontab
  • demo:https://small-stone.github.io/vCrontab/dist/
    在这里插入图片描述

vue-cron-2

  • npm:https://www.npmjs.com/package/vue-cron-2
  • demo:https://1615450788.github.io/vue-cron/dist/index
  • 搜索其他 vue cron 相关:https://www.npmjs.com/search?ranking=popularity&q=vue-cron
    (排序条件:Optimal(匹配度);Popularity(受欢迎度);Quality(质量);Maintenance(维护时间))

3.在线工具

  • quartz/Cron/Crontab表达式在线生成工具-BeJSON.com
  • 在线Cron表达式生成器(pppet)
  • 在线Cron表达式生成器(qqe2)

  • npm:qnn-react-cron - npm

over

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

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

相关文章

【JavaScript 进阶教程】数组新增遍历方法的说明与使用

文章已收录专栏&#xff1a;JavaScript 进阶教程 作者&#xff1a;卡卡西最近怎么样 文章导读&#xff1a; 欢迎来到 JavaScript 进阶的学习&#xff0c;ES5 对 JS 的数组&#xff0c;字符串等内置对象的方法均有扩充。这篇文章我们要掌握的是新增的几个 Array 内置对象的常用迭…

【Web理论篇】Web应用程序安全与风险

目录&#x1f332;1.Web应用程序的发展历程&#x1f342;1.1 Web应用程序的常见功能&#x1f342;1.2 Web应用程序的优点&#x1f332;2.Web安全&#x1f342;2.1Web应用程序常见漏洞&#x1f342;2.2未对用户输入做过滤&#x1f342;2.3 造成这些漏洞的原因是什么呢&#xff1…

【实战分享】js生成word(docx),以及将word转成pdf解决方案分享

本文将记录如何用js生成word文件&#xff0c;并在node服务器端将word转换成pdf。记录的代码均是在真实业务场景中使用成功的代码&#xff0c;没有记录中间踩坑的过程。想直接抄答案的家人们可以跳转到1.2 程序编写部分&#xff0c;最终效果图可在1.2 程序编写部分中4. 效果展示…

【解决前端报错】Bad Request: Required request parameter ‘id‘ for method parameter type Long is not present

后端查询列表接口返回的对象里包含Long id,前端获取到这个id,执行通过Long id删除操作。这时删除操作报错400&#xff0c;大意是没找着Long类型的id. swagger相关接口截图&#xff1a; Long类型的在swagger显示是integer64 &#xff0c; integer是integer32. 这是前端请求后…

微信公众号 - 实现 H5 网页在微信内置浏览器中下载文件,可预览和下载 office 文件(doc / xls / ppt / pdf 等)适用于任何前端技术栈网站,兼容安卓和苹果系统!

前言 网上的教程都是让你写页面 “引导” 右上角三个点里,让用户自己去浏览器打开,其实这样用户体验并不好。 本文实现了 最新微信公众号 H5 网页(微信内置浏览器中),预览下载 office 文件,安卓和苹果全都支持! 您可以直接复制代码,移植到自己项目中去,任何前端项目(…

全网超详细的【Axure】Axure RP 9的下载、安装、中文字体、授权

文章目录1. 文章引言2. 下载Axure93. 安装Axure94. Axure9中文5. Axure9授权1. 文章引言 最近在学习原型图&#xff0c;针对画原型图的工具&#xff0c;反复对比墨刀、Axure、xiaopiu后&#xff0c;最终选择了Axure。 接下来&#xff0c;我便从Axure RP 9的下载、安装、中文字…

VUE实现微信扫码登录

获取access_token时序图&#xff1a; public中index.html引入 <script src"https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script> 微信登录操作 new WxLogin({// 以下操作把请求到的二维码嵌入到id为"weixin"的标签中i…

走进Vue【三】vue-router详解

目录&#x1f31f;前言&#x1f31f;路由&#x1f31f;什么是前端路由&#xff1f;&#x1f31f;前端路由优点缺点&#x1f31f;vue-router&#x1f31f;安装&#x1f31f;路由初体验1.路由组件router-linkrouter-view2.步骤1. 定义路由组件2. 定义路由3. 创建 router 实例4. 挂…

VUE3 子传父 父传子 双向传递

组件参数传递 父传子 father.vue <template > <!-- 父传子实现 2.向vue页面中的子组件传递该属性 :传给子组件的名字&#xff08;自定义&#xff09;“对应定义在父组件的属性名” --><Header :openpagevaria"openpagevaria" ></Header&g…

使用vue-cli-plugin-electron-builder创建electron+vue项目

文章目录一、nvm环境二、安装vue-cli、yarn三、使用vue项目管理器创建项目四、使用vue项目管理器安装插件五、进入my-electron-vue目录&#xff0c;启动electron六、安装VueDevtools&#xff0c;解决Vue Devtools failed to install: Error: net::ERR_CONNECTION_TIMED_OUT——…

npm install xxxx --legacy-peer-deps命令是什么?

本文分享自华为云社区《npm install xxxx --legacy-peer-deps命令是什么&#xff1f;为什么可以解决下载时候产生的依赖冲突呢&#xff1f;》&#xff0c;作者&#xff1a; gentle_zhou 。 在日常使用命令npm install / npm install XX下载依赖的操作中&#xff0c;我经常会遇…

npm 报错“A complete log of this run can be found in:”解决方法

npm 启动项目 npm run serve/dev的时候报了个错&#xff1a;再次记录一下 ! code ELIFECYCLE npm ERR! errno 1 npm ERR! new0.1.0 serve: vue-cli-service serve npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the new0.1.0 serve script. npm ERR! This is probably n…

【CSS 文字渐变、背景渐变实现方式】

CSS 文字渐变&#xff0c;背景渐变的几种实现方式 在我们日常页面开发当中&#xff0c;使用合适的css渐变效果能让我们的界面更加美观&#xff0c;赏心悦目。 一、CSS 文字渐变&#xff1a; 首先&#xff0c;文字渐变实际上是通过背景渐变裁剪成文字的前景色&#xff0c;然后…

【微信小程序】初入微信小程序

大家好我依旧是山鱼&#x1f41f;&#xff0c;对于初入小程序的同学来说本篇依旧是你的不二选择&#xff0c;它详细的介绍了小程序及小程序&开发者工具的使用&#xff0c;大家快快学起来吧&#xff01; 目录 一&#xff0c;小程序简介 1.1 什么是微信小程序 1.2小程序与…

前端实现一个名言生成器

The sand accumulates to form a pagoda✨ 写在前面✨ JS是什么&#xff1f;✨ 名言生成器✨ 页面搭建✨ 功能实现✨ 写在前面 在上周我们通过HTML、CSS实现了一个简单的‘我的相册‘页面的搭建&#xff0c;很多伙伴呢跟我说难道前端就只能做一些页面搭建的工作吗&#xff1f;…

Vue3 京东到家项目实战第一篇(首页及登录功能开发) 进阶式掌握vue3完整知识体系

目录 项目首页开发 项目准备✌️ 样式开发&#x1f44d; 防抖&#x1f44a; 底部横条✌️ 登陆注册功能开发 样式编写 &#x1f450; 路由守卫实现基础登录校验功能☝️ 使用 axios 发送登录 Mock 请求&#x1f448; 请求函数的封装&#x1f64c; 通过代码拆分增加逻…

html基本标签

目录 1&#xff0c;标题标签h1-h6 2&#xff0c;段落标签p 3&#xff0c;换行标签br 4&#xff0c;水平线标签hr 5&#xff0c;图片标签img及路径详解(绝对/相对路径) 6&#xff0c;超文本链接标签a 7&#xff0c;超本文链接之锚点 8&#xff0c;div标签 9&#xff0c…

JS-获取网页滑动距离,并实时监听

介绍 本文主要介绍通过JS获取网页滑动距离&#xff0c;并实时监听的方法。分析document.body.scrollTop、document.documentElement.scrollTop、window.pageYOffset 三者之间的区别。 一、获取网页滑动距离 JS方法&#xff1a; console.log(网页被卷去的高&#xff1a;, doc…

05-ES6语法:解构赋值

本文我们介绍ES6中解构赋值。ES6的解构赋值语法是一种JS表达式。解构赋值语法是一种JS表达式&#xff0c;通过解构赋值&#xff0c;可以将属性/值从对象/数组中取出&#xff0c;赋值给其他变量。 下面我们具体来看看解构赋值是什么&#xff1f;以及是如何使用的&#xff1f; …

Bootstrap——制作个人简历网页、工具类【边框(添加、删除、颜色、圆角)、清除浮动、颜色(文本、链接、背景)、display属性、浮动、定位、文本对齐】

制作个人简历网页 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><meta name"viewport"content"widthdevice-width,initial-scale1,minimum-scale1,maximum-scale1,u…