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

4. React 中的 CSS

  • 用例中的干净的脚手架的创建可以参考另一篇文章:3.React 组件化开发
  • React官方并没有给出在React中统一的样式风格:
    • 由此,从普通的css,到css modules,再到css in js,有几十种不同的解决方案,上百个不同的库;
    • 大家一致在寻找最好的或者说最适合自己的CSS方案,但是到目前为止也没有统一的方案;

一、内联样式

  • 内联样式是官方推荐的一种css样式的写法:

    • style 接受一个采用小驼峰命名属性的 JavaScript 对象,,而不是 CSS 字符串;
    • 并且可以引用state中的状态来设置相关的样式;
  • 内联样式的优点:

    • 1.内联样式, 样式之间不会有冲突
    • 2.可以动态获取当前state中的状态
  • 内联样式的缺点:

    • 1.写法上都需要使用驼峰标识
    • 2.某些样式没有提示
    • 3.大量的样式, 代码混乱
    • 4.某些样式无法编写(比如伪类/伪元素)
  • 所以官方依然是希望内联样式和普通的css来结合编写;

    import React, { Component } from 'react';export class App extends Component {constructor() {super();this.state = {fontSize: 25,};}render() {const { fontSize } = this.state;return (<div><p style={{fontSize: '20px', color: 'red',backgroundColor: 'yellow'}}>内连样式</p><p style={{fontSize: fontSize + 'px',  color: 'blue'}}>内连样式2</p></div>);}
    }export default App;
    

二、CSS 文件

  • 普通的css我们通常会编写到一个单独的文件,之后再进行引入。
  • 这样的编写方式和普通的网页开发中编写方式是一致的:
    • 如果我们按照普通的网页标准去编写,那么也不会有太大的问题;
    • 但是组件化开发中我们总是希望组件是一个独立的模块,即便是样式也只是在自己内部生效,不会相互影响;
    • 但是普通的css都属于全局的css,样式之间会相互影响;
  • 这种编写方式最大的问题是样式之间会相互层叠掉;
  1. 创建一个干净的脚手架

  2. 父组件 App.js(App.jsx) 内容如下

    import React, { Component } from 'react'
    // 引入对应的css样式
    import "./App.css"export default class App extends Component {render() {return (<div><h3 className="title">我是标题</h3><p className="content">我是内容我是内容我是内容我是内容我是内容</p></div>)}
    }
    
  3. 创建一个父组件对应的 App.css 文件

    .title {font-size: 25px;margin: 0;
    }.content {font-size: 15px;line-height: 1.5;
    }
    
  4. 如果有两个子组件 Child1.jsx,Child2.jsx,其中Child2.jsx, Child1.jsx对应有自己的css文件,Child2.css, Child1.css , 这两个css文件中相同css类名之间会相互影响,即css 文件之间并不是只对其对应的模块有效

三、Less 配置和编写

【1】create-react-app 创建的项目

  • 我们需要修改 create-react-app 的默认配置,这里我们使用 craco (一个对 create-react-app 进行自定义配置的社区解决方案)。
  • 编写的Less 文件生成的css,都属于全局的css,样式之间会相互影响;
  • 针对 less 的使用,可以参考 https://4x-ant-design.antgroup.com/docs/react/use-with-create-react-app-cn/
  1. 安装 craco

    npm install @craco/craco
    
  2. 安装 craco-less

    npm install craco-less
    
  3. 在项目的根目录下创建 craco.config.js 文件,作为 react 的配置文件

    const CracoLessPlugin = require('craco-less');module.exports = {plugins: [{plugin: CracoLessPlugin,},],
    };
    
  4. 修改 package.json 文件中的项目启动项

    "scripts": {"start": "craco start","build": "craco build","test": "craco test","eject": "react-scripts eject"
    },
    
  5. 启动项目

    npm run start
    

【2】vite 创建的项目

  • 编写的Less 文件生成的css,都属于全局的css,样式之间会相互影响;
  1. 在项目中安装 less 和 less-loader,它们是处理 Less 文件所需的依赖项:

    npm install less less-loader --save-dev
    
  2. 修改 vite.config.js 文件,添加对 Less 的支持。

    	export default defineConfig({plugins: [react()],css: {preprocessorOptions: {less: {// 可选:如果你需要全局变量或混入文件,可以在这里配置//additionalData: `@import "./src/styles/global.less";`,},},},});
    
  3. 在 src 目录下创建一个 .less 文件,例如 src/App.less。

    @primary-color: #4caf50;.app {color: @primary-color;font-size: 1.5em;
    }
    
  4. 在src/App.jsx 组件中引入该 Less 文件。

    import React, { memo } from 'react';
    import './App.less';const App = memo(() => {return <div className='app'>App</div>;
    });export default App;
    

四、CSS modules

  • css modules并不是React特有的解决方案,而是所有使用了类似于webpack配置的环境下都可以使用的。

    • 如果在其他项目中使用它,那么我们需要自己来进行配置,比如配webpack.config.js中的modules: true等。
    • React的脚手架已经内置了css modules的配置: .css/.less/.scss 等样式文件都需要修改成 .module.css/.module.less/.module.scss 等; 之后就可以引用并且进行使用了;
  • css modules确实解决了局部作用域的问题,也是很多人喜欢在React中使用的一种方案。

  • 但是这种方案也有自己的缺陷:

    • 引用的类名,不能使用连接符(.home-title),在JavaScript中是不识别的;
    • 所有的className都必须使用{style.className} 的形式来编写;
    • 不方便动态来修改某些样式,依然需要使用内联样式的方式;
  1. 创建一个干净的脚手架
  2. 父组件 App.js(App.jsx) 内容如下
    import React, { Component } from 'react';
    // 引入样式
    import appStyle from './App.module.css';export default class App extends Component {render() {return (<div>{/* 使用样式 */}<div className={appStyle.title}>标题</div><p className={appStyle.content}>我是内我是内容我是内容我是内容我是内容我是内容容</p></div>);}
    }
    
  3. 新建一个 App.module.css 文件,内容如下
    .title {font-size: 25px;color: red;
    }.content {font-size: 15px;line-height: 1.2;
    }
    

五、CSS in JS

  • 官方文档也有提到过CSS in JS这种方案:
    • “CSS-in-JS” 是指一种模式,其中 CSS 由 JavaScript 生成而不是在外部文件中定义;
    • 注意此功能并不是 React 的一部分,而是由第三方库提供;
    • React 对样式如何定义并没有明确态度;
  • 在传统的前端开发中,我们通常会将结构(HTML)、样式(CSS)、逻辑(JavaScript)进行分离。
    • 但是在前面的学习中,我们就提到过,React的思想中认为逻辑本身和UI是无法分离的,所以才会有了JSX的语法。
    • 样式呢?样式也是属于UI的一部分;
    • 事实上CSS-in-JS的模式就是一种将样式(CSS)也写入到JavaScript中的方式,并且可以方便的使用JavaScript的状态;
    • 所以React有被人称之为 All in JS;
  • 目前比较流行的CSS-in-JS的库有哪些呢?
    • styled-components
    • emotion
    • glamorous
  • 目前可以说styled-components依然是社区最流行的CSS-in-JS库

【1】 使用 styled-components

  • styled-components的本质是通过函数的调用,最终创建出一个组件:
  • 更多用法可以参考官网:https://styled-components.com/docs
  1. 安装 styled-components 库

    npm install styled-components 
    
  2. 在 vscode 中安装插件 vscode-styled-components
    在这里插入图片描述

  3. 创建一个干净的脚手架

  4. 父组件 App.js(App.jsx) 内容如下

    import React, { Component } from 'react';
    import { AppWrapper, ContentWrapper, FooterWrapper } from './Style.js';export default class App extends Component {constructor() {super();this.state = {color: '#999',contentStyle: {fontSize: '14'},};}changeContentColor() {this.setState({color: '#333',});}render() {const { contentStyle, color } = this.state;return (<AppWrapper><h2 className="title"><p>标题</p><small>小标题</small></h2>{/* 通过结构传递 props  */}<ContentWrapper color={color} {...contentStyle}><p>内容</p><ul><li>列表1</li><li>列表2</li><li>列表3</li><li>列表4</li></ul><button onClick={(e) => this.changeContentColor()}>修改内容的颜色</button></ContentWrapper><FooterWrapper>底部</FooterWrapper></AppWrapper>);}
    }
    
  5. 新建 Style.js 文件,用于设置样式

    import styled from 'styled-components';// 用法参考:函数模板字符串
    // styled.div 是一个函数,返回一个组件
    export const AppWrapper = styled.div`.title {color: red;p {font-size: 20px;}small {font-size: 12px;}}
    `;// 通过 props 传递参数
    export const ContentWrapper = styled.div`p {color: ${(props) => props.color};}ul {li {color: ${(props) => props.color};font-size: ${(props) => props.fontSize}px;&:hover {color: red;}cursor: pointer;}}
    `;// 设置默认值
    export const FooterWrapper = styled.div.attrs((props) => ({color: props.color || 'yellow',
    }))`color: ${(props) => props.color};
    `;
    

六、React 中添加 class

【1】classnames 库

  • git 仓库:https://github.com/JedWatson/classnames

  • classnames 是一个用于动态地构建 CSS 类名字符串的 JavaScript 库,常用于 React 项目中。它可以根据条件来组合多个类名,简化了在模板中根据逻辑添加或删除 CSS 类名的过程。

  • 不使用 classnames 库的代码

    <div className={`button ${isActive ? 'button-active' : ''} ${isDisabled ? 'button-disabled' : ''}`}>Click me
    </div>
    
  • 使用 classnames 库的代码

    import classNames from 'classnames';<div className={classNames('button', { 'button-active': isActive, 'button-disabled': isDisabled })}>Click me
    </div>
    
  1. 创建一个干净的脚手架

  2. 安装 classnames 库

     npm install classnames
    
  3. 父组件 App.js(App.jsx) 内容如下

    import React, { Component } from 'react';
    import classNames from 'classnames';export default class App extends Component {render() {//结果:"class1 class2"const classname1 = classNames('class1', 'class2');//结果:"class1 class2"const classname2 = classNames('class1', { class2: true });//结果:"class1 class2"const classname3 = classNames('class1', { class2: 1 });//结果:"class1"const classname4 = classNames('class1', { class2: false });//结果:"class1"const classname5 = classNames({ class1: true, class2: false });//结果:"class1 class2"const classname6 = classNames(['class1', 'class2']);//结果:class1 class3 class4const classname7 = classNames('class1', { class2: false }, ['class3','class4',]);return (<div><div className={classname1}>classname1</div><div className={classname2}>classname2</div><div className={classname3}>classname3</div><div className={classname4}>classname4</div><div className={classname5}>classname5</div><div className={classname6}>classname6</div><div className={classname7}>classname7</div></div>);}
    }
    

七、React 的过渡动画

(一) react-transition-group 介绍

  • 在开发中,我们想要给一个组件的显示和消失添加某种过渡动画,可以很好的增加用户体验。

  • 当然,我们可以通过原生的CSS来实现这些过渡动画,但是React社区为我们提供了react-transition-group用来完成过渡动画。

  • React曾为开发者提供过动画插件 react-addons-css-transition-group,后由社区维护,形成了现在的 react-transition-
    group。

  • 这个库可以帮助我们方便的实现组件的 入场 和 离场 动画,使用时需要进行额外的安装:

    npm install react-transition-group --save
    
  • react-transition-group本身非常小,不会为我们应用程序增加过多的负担。

  • github 地址:https://github.com/reactjs/react-transition-group

  • 官方网站:https://reactcommunity.org/react-transition-group/

(二) react-transition-group主要组件

【1】Transition 组件

  • 该组件是一个和平台无关的组件(不一定要结合CSS);如果需要结合 CSS 最好使用 CSSTransition,它继承了Transition的所有特性,而且包含了一些额外的特性。

  • Transition组件允许您使用简单的声明式 API描述随时间从一个组件状态到另一个组件状态的转换

  • 默认情况下,Transition组件不会改变它呈现的组件的行为,它只跟踪组件的进入和退出状态。赋予这些状态以意义和效果取决于您

  • 转换可以处于4 种主要状态

    • entering 进入中
    • entered 进入后
    • exiting 离开中
    • exited 离开后
  • 过渡状态通过 in 属性切换。当为 true 时组件开始进入阶段。在此阶段,组件将从其当前的过渡状态转移到entering过渡期间,然后在entered完成后进入该阶段

  • in改为false进行同样的事情,状态从移动exitingexited

  • 属性:

    属性名类型默认含义
    nodeRefelementReactDOM.findDOMNode对需要转换的 DOM 元素的 React 引用
    inbooleanfalse显示组件;触发进入或退出状态
    childrenFunction或element必需function可以使用子元素代替 React 元素。此函数使用当前转换状态(entering, entered, exiting,exited)调用,可用于将特定于上下文的属性应用于组件
    timeoutnumber过渡的持续时间,以毫秒为单位
  1. 创建一个干净的脚手架

  2. 安装 react-transition-group

    npm install react-transition-group --save
    
  3. 修改 src/App.js(App.jsx) 文件,引入Transition 组件

    import React, { PureComponent } from 'react';
    import { Transition } from 'react-transition-group';export class App extends PureComponent {constructor() {super();this.nodeRef = React.createRef(null);this.state = {isShowTitle: true,defaultStyle: {transition: `opacity 1000ms ease-in-out`,opacity: 0,},transitionStyles: {entering: { opacity: 1 },entered: { opacity: 1 },exiting: { opacity: 0 },exited: { opacity: 0 },},};}changeSonShow() {this.setState({isShowTitle: !this.state.isShowTitle,});}render() {const { isShowTitle, defaultStyle, transitionStyles } = this.state;return (<div><button onClick={() => this.changeSonShow()}>{isShowTitle ? '显示标题' : '隐藏标题'}</button><Transition nodeRef={this.nodeRef} in={isShowTitle} timeout={1000}>{(state) => (<divstyle={{...defaultStyle,...transitionStyles[state],}}>标题标题标题标题标题标题标题标题</div>)}</Transition></div>);}
    }export default App;
    

【2】CSSTransition 组件

  • CSSTransition是基于Transition组件构建的:
  • CSSTransition执行过程中,有三个状态:appear、enter、exit;
  • 它们有三种状态,需要定义对应的CSS样式:
    • 第一类,开始状态:对于的类是-appear、-enter、exit;
    • 第二类:执行动画:对应的类是-appear-active、-enter-active、-exit-active;
    • 第三类:执行结束:对应的类是-appear-done、-enter-done、-exit-done;
  • CSSTransition常见对应的属性:
    • in:触发进入或者退出状态

      • 如果添加了unmountOnExit={true},那么该组件会在执行退出动画结束后被移除掉;
      • 当in为true时,触发进入状态,会添加-enter、-enter-acitve的class开始执行动画,当动画执行结束后,会移除两个class,
        并且添加-enter-done的class;
      • 当in为false时,触发退出状态,会添加-exit、-exit-active的class开始执行动画,当动画执行结束后,会移除两个class,并
        且添加-enter-done的class;
    • classNames:动画class的名称

      • 决定了在编写css时,对应的class名称:比如card-enter、card-enter-active、card-enter-done;
    • timeout:

      • 过渡动画的时间
    • appear:

      • 是否在初次进入添加动画(需要和in同时为true)
    • unmountOnExit:

      • 如果为true时,退出后将卸载组件
  • CSSTransition对应的钩子函数:主要为了检测动画的执行过程,来完成一些JavaScript的操作
    • onEnter:在进入动画之前被触发;
    • onEntering:在应用进入动画时被触发;
    • onEntered:在应用进入动画结束后被触发;
  1. 创建一个干净的脚手架

  2. 安装 react-transition-group

    npm install react-transition-group --save
    
  3. 修改 src/App.js(App.jsx) 文件,引入CSSTransition 组件

    import React, { PureComponent } from 'react';
    import { CSSTransition } from 'react-transition-group';
    import './style.css';export default class App extends PureComponent {constructor() {super();this.nodeRef = React.createRef(null);this.state = {isShow: true,};}render() {const { isShow } = this.state;return (<div><buttononClick={() => {this.setState({ isShow: !isShow });}}>显示/隐藏</button><CSSTransitionnodeRef={this.nodeRef}in={isShow}timeout={1000}classNames="test"unmountOnExitonEnter={(e) => console.log('开始进入动画')}onEntering={(e) => console.log('进入动画进行中')}onEntered={(e) => console.log('进入动画结束')}onExit={(e) => console.log('开始退出动画')}onExiting={(e) => console.log('退出动画进行中')}onExited={(e) => console.log('退出动画结束')}><h2 ref={this.nodeRef}>文字文字文字文字文字文字</h2></CSSTransition></div>);}
    }
    
  4. 在src/App.js 文件所处的文件夹下创建 style.css 文件

    .test-enter {opacity: 0;
    }.test-enter-active {opacity: 1;transition: opacity 1s ease;
    }.test-exit {opacity: 1;
    }.test-exit-active {opacity: 0;transition: opacity 1s, transform 1s;
    }
    

【3】SwitchTransition 组件

  • SwitchTransition可以完成两个组件之间切换的炫酷动画:

    • 比如我们有一个按钮需要在on和off之间切换,我们希望看到on先从左侧退出,off再从右侧进入;
    • 这个动画在vue中被称之为 vue transition modes;
    • react-transition-group中使用SwitchTransition来实现该动画;
  • SwitchTransition中主要有一个属性:mode,有两个值

    • in-out:表示新组件先进入,旧组件再移除;
    • out-in:表示旧组件先移除,新组建再进入;
  • 如何使用SwitchTransition呢?

    • SwitchTransition组件里面要有CSSTransition或者Transition组件,不能直接包裹你想要切换的组件;
    • SwitchTransition里面的CSSTransition或Transition组件不再像以前那样接受in属性来判断元素是何种状态,取而代之的是
      key属性;
  1. 创建一个干净的脚手架

  2. 安装 react-transition-group

    npm install react-transition-group --save
    
  3. 修改 src/App.js(App.jsx) 文件,引入SwitchTransition 和 CSSTransition 组件

    import React, { PureComponent } from 'react';
    import { SwitchTransition, CSSTransition } from 'react-transition-group';
    import './style.css';export class App extends PureComponent {constructor() {super();this.nodeRef = React.createRef(null);this.state = {isLogin: false,};}render() {const { isLogin } = this.state;return (<div style={{ textAlign: 'center' }}><SwitchTransition mode="out-in"><CSSTransitionnodeRef={this.nodeRef}key={isLogin ? 'exit' : 'login'}classNames="login"timeout={1000}><buttonref={this.nodeRef}onClick={(e) =>this.setState({isLogin: !isLogin,})}>{isLogin ? '退出' : '登录'}</button></CSSTransition></SwitchTransition></div>);}
    }export default App;
    
  4. 在src/App.js 文件所处的文件夹下创建 style.css 文件

    .login-enter {transform: translateX(100px);opacity: 0;
    }.login-enter-active {transform: translateX(0);opacity: 1;transition: all 1s ease;
    }.login-exit {transform: translateX(0);opacity: 1;
    }.login-exit-active {transform: translateX(-100px);opacity: 0;transition: all 1s ease;
    }
    

【4】TransitionGroup 组件

  • 当我们有一组动画时,需要将这些CSSTransition放入到一个TransitionGroup中来完成动画:
  1. 创建一个干净的脚手架

  2. 安装 react-transition-group

    npm install react-transition-group --save
    
  3. 修改 src/App.js(App.jsx) 文件,引入TransitionGroup 和 CSSTransition 组件

    import React, { PureComponent } from 'react';
    import { TransitionGroup, CSSTransition } from 'react-transition-group';
    import './style.css';export class App extends PureComponent {constructor() {super();this.state = {curId: 4,books: [{id: 1,name: '你不知道的JS',price: 99,nodeRef: React.createRef(null),},{id: 2,name: 'JS高级程序设计',price: 88,nodeRef: React.createRef(null),},{id: 3,name: 'Vue高级设计',price: 66,nodeRef: React.createRef(null),},],};}addNewBook() {const { books, curId } = this.state;this.setState({books: [...books,{ id: curId, name: 'ES' + curId, price: 55, nodeRef: React.createRef(null) },],});this.setState({ curId: curId + 1 });}delBookHandle(index) {const { books } = this.state;this.setState({books: books.filter((item, i) => i !== index),});}render() {const { books } = this.state;return (<div><TransitionGroup component="ul">{books.map((item, index) => {return (<CSSTransitionnodeRef={item.nodeRef}key={item.id}classNames="book"timeout={1000}><li ref={item.nodeRef}><span>{item.name}-{item.price}</span><button onClick={() => this.delBookHandle(index)}>删除</button></li></CSSTransition>);})}</TransitionGroup><button onClick={() => this.addNewBook()}>添加书籍</button></div>);}
    }export default App;
    
  4. 在src/App.js 文件所处的文件夹下创建 style.css 文件

    .book-enter {transform: translateX(100px);opacity: 0;
    }.book-enter-active {transform: translateX(0);opacity: 1;transition: all 1s ease;
    }.book-exit {transform: translateX(0);opacity: 1;
    }.book-exit-active {transform: translateX(150px);opacity: 0;transition: all 1s ease;
    }

相关文章:

4. React 中的 CSS

用例中的干净的脚手架的创建可以参考另一篇文章&#xff1a;3.React 组件化开发React官方并没有给出在React中统一的样式风格&#xff1a; 由此&#xff0c;从普通的css&#xff0c;到css modules&#xff0c;再到css in js&#xff0c;有几十种不同的解决方案&#xff0c;上百…...

【工业安全】-CVE-2019-17621-D-Link Dir-859L 路由器远程代码执行漏洞

文章目录 1.漏洞描述 2.环境搭建 3.漏洞复现 4.漏洞分析  4.1&#xff1a;代码分析  4.2&#xff1a;流量分析 5.poc代码&#xff1a; 1.漏洞描述 漏洞编号&#xff1a;CVE-2019-17621 漏洞名称&#xff1a;D-Link DIR-859 命令注入漏洞 威胁等级&#xff1a;严重 漏洞详…...

FastExcel + Java:打造高效灵活的Excel数据导入导出解决方案

作者&#xff1a;后端小肥肠 &#x1f347; 我写过的文章中的相关代码放到了gitee&#xff0c;地址&#xff1a;xfc-fdw-cloud: 公共解决方案 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; 基于AOP的数据字典实现…...

fun-transformer学习笔记-Task1——Transformer、Seq2Seq、Encoder-Decoder、Attention之间的关系

Transformer、Seq2Seq、Encoder-Decoder、Attention由这四者之间的关系可以从模型架构的发展脉络来理解&#xff1a; Seq2Seq 与 Encoder–Decoder 模型 “Seq2Seq”&#xff08;sequence‐to‐sequence&#xff09;是一类用于将一个变长序列映射为另一个变长序列的任务&#x…...

使用Hexo部署NexT主体网站

一.使用git提交文件 参考&#xff1a; 从零开始搭建个人博客&#xff08;超详细&#xff09; - 知乎 致谢&#xff01; 第一种&#xff1a;本地没有 git 仓库 直接将远程仓库 clone 到本地&#xff1b;将文件添加并 commit 到本地仓库&#xff1b;将本地仓库的内容push到远程仓…...

图书管理项目(spring boot + Vue)

想要该项目的话&#xff0c;就 jia 我&#xff0c;并在评论区给我说一下&#xff0c;只需要1元&#xff0c;我把整个项目发给你 jia微&#xff1a;18439421203&#xff08;名字叫&#xff1a;Bingo&#xff09; 运行图片&#xff1a;...

python实现常见数学概率分布

常见正态分布 1.贝塔分布1.1 概率密度函数1.2参数对分布形状的影响1.3 应用场景1.4 python实现 2. 帕累托分布&#xff08;80/20法则&#xff09;3. 正态分布&#xff08;高斯分布&#xff09;3.1 正态分布对应性质3.2 正态分布对应图像![在这里插入图片描述](https://i-blog.c…...

解决Blender无法识别Num关闭状态下的笔记本数字键盘中Home键、End键问题

问题描述&#xff1a; 在笔记本电脑上&#xff0c;多少会缺少一些按钮&#xff0c;例如“Home”、“End”、“PgUp”、“PgDn”&#xff0c;它们在笔记本电脑上的作用是&#xff0c;如果关闭Num&#xff0c;则可以从数字键盘访问这些按钮。但问题是在Blender中&#xff0c;不论…...

React 高级教程

使用 React 高级组件&#xff08;HOC&#xff09;实现的完整项目示例&#xff0c;包含权限控制、数据加载状态处理、性能优化等常见高级功能。创建一个简单的博客系统: // 项目结构&#xff1a; src/ |-- components/ | |-- ArticleList.jsx | |-- Article.jsx | |-- He…...

基于Qt 和微信小程序的用户管理系统:WebSocket + SQLite 实现注册与登录

目录 一. 概要 二. 技术栈 三. 系统功能设计 3.1 功能模块 3.2 数据表设计 四. 具体实现 4.1 Qt 服务端 4.1.1 初始化 WebSocket 服务器 4.1.2 用户管理界面 4.2 微信小程序端 4.2.1 注册功能 4.2.2 登录功能 五. 运行效果 六. 源码下载 一. 概要 在物联网和智能设备…...

在CT107D单片机综合训练平台上实现外部中断控制LED闪烁

引言 在单片机开发中&#xff0c;外部中断是一个非常重要的功能&#xff0c;它可以让单片机在检测到外部信号变化时立即做出响应。本文将详细介绍如何在CT107D单片机综合训练平台上使用外部中断来控制LED灯的闪烁。我们将使用两种不同的方式来实现这一功能&#xff1a;一种是在…...

HTML之JavaScript使用JSON

HTML之JavaScript使用JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成。JSON是JavaScript对象的字符串表示法&#xff0c;它使用文本表示一个js对象的信息&#xff0c;可以将json字符串转换…...

算法很美笔记(Java)——树

性质 树 上面的性质因为两个结点由一条边连成 结点数目越多&#xff0c;算法复杂度越高 二叉树 结构 层次遍历 利用队列&#xff0c;弹一个&#xff0c;加N个&#xff08;队列里弹出一个元素&#xff0c;就把这个元素的所有孩子加进去&#xff09; 具体来说&#xff1a;指…...

SQL面试题4:相互关注问题

引言 在社交媒体和各类社区平台蓬勃发展的当下&#xff0c;用户之间的关系网络成为了平台运营和数据分析的关键部分。相互关注作为一种重要的社交关系&#xff0c;不仅反映了用户之间的紧密程度&#xff0c;还对平台的社交生态、内容传播等方面有着深远影响。本文将聚焦于 SQL…...

ArcGIS基础知识之ArcMap基础设置——ArcMap选项:常规选项卡设置及作用

作为一名 GIS 从业者,ArcMap 是我们日常工作中不可或缺的工具。对于初学者来说,掌握 ArcMap 的基础设置是迈向 GIS 分析与制图的第一步。今天,就让我们一起深入了解 ArcMap 选项中常规选项卡的各个设置,帮助大家更好地使用这款强大的软件。 在 ArcMap 中,常规选项卡是用户…...

jvm 线程监控调试

文章目录 前言一、使用JDK工具转储线程文件(如jstack)1. 找到Java进程的PID:2. 使用jstack生成线程转储文件:3.验证生成的线程转储文件:二、分析文件1.使用在线工具进行分析上传thread-dump文件,等待解析完成2.查看分析结果总结前言 提示:使用jdk自带工具转储线程监控文…...

25、深度学习-自学之路-卷积神经网络基于MNIST数据集的程序展示

import keras #添加Keraskuimport sys,numpy as np from keras.utils import np_utilsimport osfrom keras.datasets import mnist print("licheng&#xff1a;""20"\n) np.random.seed(1)(x_train,y_train),(x_test,y_test) mnist.load_data() #第一次…...

【C++】解锁<list>的正确姿势

> &#x1f343; 本系列为初阶C的内容&#xff0c;如果感兴趣&#xff0c;欢迎订阅&#x1f6a9; > &#x1f38a;个人主页:[小编的个人主页])小编的个人主页 > &#x1f380; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 > ✌️ &#x1f91e; &#x1…...

Qt中的事件

写一个 可以拖动的按钮 DraggablePushButton.h 头文件 #ifndef DRAGGABLEPUSHBUTTON_H #define DRAGGABLEPUSHBUTTON_H#include <QPushButton> #include <QMouseEvent>class DraggablePushButton : public QPushButton {Q_OBJECTpublic:explicit DraggablePushBu…...

变化检测相关论文可读list

一些用得上的&#xff1a; 遥感变化检测常见数据集https://github.com/rsdler/Remote-Sensing-Change-Detection-Dataset/ 代码解读&#xff1a;代码解读 | 极简代码遥感语义分割&#xff0c;结合GDAL从零实现&#xff0c;以U-Net和建筑物提取为例 NeurIPS2024: https://mp.w…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...