当前位置: 首页 > 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…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

ArcPy扩展模块的使用(3)

管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如&#xff0c;可以更新、修复或替换图层数据源&#xff0c;修改图层的符号系统&#xff0c;甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...

归并排序:分治思想的高效排序

目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法&#xff0c;由约翰冯诺伊曼在1945年提出。其核心思想包括&#xff1a; 分割(Divide)&#xff1a;将待排序数组递归地分成两个子…...