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

大白话React第十一章React 相关的高级特性以及在实际项目中的应用优化

假设我们已经对 React 前端框架的性能和可扩展性评估有了一定了解,接下来的阶段可以深入学习 React 相关的高级特性以及在实际项目中的应用优化,以下是详细介绍及代码示例:

1. React 高级特性的深入学习

1.1 React 并发模式(Concurrent Mode)
  • 白话解释:以前 React 处理任务就像一个人一次只做一件事,做完一件再做下一件。而并发模式就像一个人能同时处理多个任务,能根据任务的紧急程度和优先级灵活切换,让页面响应更快更流畅。比如在一个复杂的页面中,有数据加载、动画效果等任务,并发模式能合理安排这些任务的执行顺序,避免用户操作时出现卡顿。
  • 代码示例:目前 React 的并发模式还在不断发展完善中,以下是一个简单示意(实际使用可能需要更多配置和特定环境)。
import React, { useState, useEffect } from'react';const ConcurrentExample = () => {const [data, setData] = useState(null);const [isLoading, setIsLoading] = useState(true);useEffect(() => {// 模拟异步数据加载const fetchData = async () => {await new Promise((resolve) => setTimeout(resolve, 2000));setData('这是加载的数据');setIsLoading(false);};fetchData();}, []);return (<div>{isLoading? (<p>数据加载中...</p>) : (<p>{data}</p>)}{/* 这里假设在并发模式下可以更灵活地处理用户交互和数据加载的优先级 */}</div>);
};export default ConcurrentExample;
1.2 React 悬浮(Suspense)和异步边界(Async Boundaries)
  • 白话解释:Suspense 就像一个“等待室”,当组件需要等待一些异步操作(比如数据加载、组件渲染等)完成时,Suspense 可以先显示一个等待提示,等异步操作完成后再显示实际内容。而异步边界则是用来处理异步操作中出现的错误,就像一个“安全卫士”,当异步操作出错时,它能捕获错误并进行处理,不让应用崩溃。
  • 代码示例
import React, { Suspense, useState, useEffect } from'react';// 模拟一个异步加载的组件
const AsyncComponent = React.lazy(() => new Promise((resolve) => {setTimeout(() => {resolve(() => <div>这是异步加载的组件内容</div>);}, 1500);
}));const SuspenseExample = () => {return (<div><Suspense fallback={<p>加载中,请稍候...</p>}><AsyncComponent /></Suspense></div>);
};export default SuspenseExample;

2. 实际项目中的性能优化实战

2.1 优化 React 应用的代码分割
  • 白话解释:代码分割就像把一个大文件拆分成多个小文件,当用户需要某个功能时,才加载对应的小文件,而不是一开始就把所有代码都加载进来。这样可以减少初始加载时间,提高应用的性能。
  • 代码示例:使用 React.lazy 和 React Router 进行代码分割。
import React, { Suspense, lazy } from'react';
import { BrowserRouter as Router, Routes, Route } from'react-router-dom';// 懒加载组件
const HomePage = lazy(() => import('./pages/HomePage'));
const AboutPage = lazy(() => import('./pages/AboutPage'));const App = () => {return (<Router><Routes><Route path="/" element={<Suspense fallback={<p>加载首页中...</p>}><HomePage /></Suspense>} /><Route path="/about" element={<Suspense fallback={<p>加载关于页面中...</p>}><AboutPage /></Suspense>} /></Routes></Router>);
};export default App;
2.2 利用 React.memo、useCallback 和 useMemo 优化组件渲染
  • 白话解释:React.memo 可以防止函数组件在 props 没有变化时重新渲染;useCallback 可以记住函数,避免每次渲染都创建新的函数;useMemo 可以记住计算结果,避免重复计算。它们就像“优化小能手”,能让组件渲染更高效。
  • 代码示例
import React, { useState, useCallback, useMemo } from'react';const ExpensiveCalculation = (props) => {console.log('进行昂贵的计算');return props.value * 2;
};const OptimizedComponent = () => {const [count, setCount] = useState(0);const [toggle, setToggle] = useState(false);// 使用 useCallback 记住函数const handleIncrement = useCallback(() => {setCount(count + 1);}, [count]);// 使用 useMemo 记住计算结果const result = useMemo(() => {return <ExpensiveCalculation value={count} />;}, [count]);return (<div><p>计数: {count}</p><button onClick={handleIncrement}>增加计数</button><p>{toggle? '显示' : '隐藏'}</p><button onClick={() => setToggle(!toggle)}>切换显示</button>{result}</div>);
};export default OptimizedComponent;

3. 与其他技术栈的深度集成

3.1 React 与 GraphQL 的集成
  • 白话解释:GraphQL 是一种用于 API 的查询语言,它能让前端更灵活地获取数据。React 与 GraphQL 集成后,就像给前端找了一个更聪明的“数据采购员”,能按需获取数据,避免获取过多不需要的数据,提高数据获取的效率。
  • 代码示例:使用 Apollo Client 来集成 React 和 GraphQL。
import React from'react';
import { ApolloClient, InMemoryCache, ApolloProvider, gql } from '@apollo/client';
import { useQuery } from '@apollo/client';// 创建 Apollo Client
const client = new ApolloClient({uri: 'https://your-graphql-server-url',cache: new InMemoryCache()
});// 定义 GraphQL 查询
const GET_USERS = gql`query GetUsers {users {idnameemail}}
`;const GraphQLExample = () => {const { loading, error, data } = useQuery(GET_USERS);if (loading) return <p>加载用户数据中...</p>;if (error) return <p>获取用户数据出错: {error.message}</p>;return (<div><h2>用户列表</h2><ul>{data.users.map(user => (<li key={user.id}>{user.name} - {user.email}</li>))}</ul></div>);
};const App = () => {return (<ApolloProvider client={client}><GraphQLExample /></ApolloProvider>);
};export default App;
3.2 React 与微服务架构的结合
  • 白话解释:微服务架构就像把一个大公司拆分成多个小公司,每个小公司负责不同的业务。React 与微服务架构结合,能让前端应用更好地与不同的后端微服务进行交互,每个微服务可以独立开发、部署和维护,提高了整个系统的灵活性和可扩展性。
  • 代码示例:这里简单示意一个 React 组件调用微服务接口获取数据的过程(实际的微服务架构会更复杂)。
import React, { useState, useEffect } from'react';const MicroServiceExample = () => {const [data, setData] = useState(null);const [isLoading, setIsLoading] = useState(true);useEffect(() => {// 模拟调用微服务接口获取数据const fetchData = async () => {const response = await fetch('https://your-microservice-url');const jsonData = await response.json();setData(jsonData);setIsLoading(false);};fetchData();}, []);return (<div>{isLoading? (<p>数据加载中...</p>) : (<div><h2>从微服务获取的数据</h2><pre>{JSON.stringify(data, null, 2)}</pre></div>)}</div>);
};export default MicroServiceExample;

通过以上内容的学习和实践,能进一步提升对 React 框架的理解和应用能力,更好地应对实际项目中的各种需求。

React在移动应用开发中的应用和优化

以下用通俗易懂的语言为你介绍React在移动应用开发中的应用和优化:

React在移动应用开发中的应用

  • 组件化开发:React就像一个搭积木的游戏,把移动应用的界面拆分成很多小的积木块,也就是组件。像一个音乐播放应用,播放按钮、进度条、歌曲列表都是一个个独立的组件。每个组件都有自己的功能,比如播放按钮负责播放和暂停歌曲,进度条能显示歌曲播放到哪里了。这样开发起来很方便,哪里出问题就只需要检查对应的组件。
// 定义一个播放按钮组件
const PlayButton = () => {return <button>播放</button>;
};
  • 跨平台应用:用React开发的应用可以在iOS和安卓两个平台上都能运行。就好像一套代码可以穿两件不同的衣服,在苹果手机和安卓手机上都能展示出好看的界面,不用为每个平台单独写很多不同的代码,节省了很多时间和精力。比如开发一个外卖应用,用React开发后,既能在苹果手机上给用户点外卖,也能在安卓手机上用。
  • 数据绑定与交互:React能让数据和界面很好地配合。在一个社交应用里,用户发布的动态就是数据,React能把这些数据显示在界面上。当有新的动态发布,或者用户点赞、评论,React能马上更新界面,让大家看到最新的情况。而且用户在界面上的操作,比如点击头像查看个人信息,React也能快速做出反应。
import React, { useState } from 'react';const SocialApp = () => {// 用useState管理动态数据const [posts, setPosts] = useState([]);// 模拟发布新动态的函数const addPost = (newPost) => {// 把新动态添加到posts数组中setPosts([...posts, newPost]);};return (<div>{/* 显示动态列表 */}{posts.map((post) => (<div key={post.id}><p>{post.content}</p></div>))}{/* 发布新动态的输入框和按钮 */}<input placeholder="输入新动态" onChange={(e) => setNewPost(e.target.value)} /><button onClick={() => addPost(newPost)}>发布</button></div>);
};

React在移动应用开发中的优化

  • 懒加载:就像你看书,不需要一下子把整本书都看完,React的懒加载就是让应用在需要的时候才去加载一些组件或数据。比如一个新闻应用,用户一开始打开只看到首页的新闻列表,只有当用户点击进入具体新闻详情页时,才去加载详情页的内容,这样可以加快首页的加载速度,让用户更快看到有用的信息。
import React, { lazy, Suspense } from 'react';// 懒加载新闻详情组件
const NewsDetail = lazy(() => import('./NewsDetail'));const NewsApp = () => {return (<div>{/* 新闻列表 */}<ul><li><a href="#" onClick={() => setShowDetail(true)}>新闻标题</a></li></ul>{/* 用Suspense包裹懒加载组件,显示加载动画 */}<Suspense fallback={<div>加载中...</div>}>{showDetail && <NewsDetail />}</Suspense></div>);
};
  • 虚拟DOM优化:React会在内存里先创建一个虚拟的DOM结构,就像是一个房子的设计图。当数据发生变化时,React会先在虚拟DOM上计算哪些地方需要更新,然后只把真正需要改变的部分更新到实际的DOM上,而不是把整个页面都重新渲染一遍,这样能大大提高更新的效率。
  • 优化组件渲染:可以通过一些方法让组件只在必要的时候才重新渲染。比如使用React.memo来包裹组件,如果组件的props没有变化,就不会重新渲染。在一个商品列表组件中,如果商品数据没有变化,就不需要重新渲染整个列表。
import React, { memo } from 'react';// 用React.memo包裹组件,进行性能优化
const ProductList = memo(({ products }) => {return (<ul>{products.map((product) => (<li key={product.id}>{product.name}</li>))}</ul>);
});

如何在移动应用开发中优化React性能?
在移动应用开发里,要是想让 React 做出来的应用跑得快、不卡顿,下面这些优化方法你可得记好了。

组件优化

  • 减少不必要的渲染
    • React.memo 检查组件:想象组件是个小工厂,每次接到新订单(props 变化)就会开工生产(重新渲染)。但有时候订单其实没变化,工厂也没必要重新生产。React.memo 就像个小秘书,会帮函数组件检查订单(props)有没有变,没变就不让工厂重新开工,这样能省不少时间和精力。
    import React, { memo } from'react';const MyComponent = memo(({ data }) => {return <div>{data}</div>;
    });export default MyComponent;
    
    • shouldComponentUpdate 把关类组件:对于类组件,shouldComponentUpdate 就像个门卫,能决定组件这个房子要不要重新装修(重新渲染)。你可以在这个门卫这里定些规则,比如某些东西没变就不让装修。
    import React, { Component } from'react';class MyClassComponent extends Component {shouldComponentUpdate(nextProps, nextState) {// 这里可以写判断逻辑,比如只有当数据变化时才更新return this.props.data!== nextProps.data;}render() {return <div>{this.props.data}</div>;}
    }export default MyClassComponent;
    
  • 使用 React.lazy 和 Suspense 懒加载:这俩就像聪明的快递员,不会一下子把所有包裹(组件)都送过来,而是等你需要的时候再送。比如一个应用有很多页面,一开始不用把所有页面的代码都加载进来,等用户点到哪个页面,再去加载那个页面的代码。
    import React, { lazy, Suspense } from'react';// 懒加载组件
    const LazyComponent = lazy(() => import('./LazyComponent'));const App = () => {return (<div><Suspense fallback={<div>加载中...</div>}><LazyComponent /></Suspense></div>);
    };export default App;
    

状态管理优化

  • 合理使用 useState 和 useReduceruseState 就像一个小盒子,能装简单的数据;useReducer 像个大仓库,适合管理复杂的数据和状态变化。如果状态变化简单,用 useState 就行;要是状态变化复杂,有很多规则,就用 useReducer
    // 使用 useState
    import React, { useState } from'react';const Counter = () => {const [count, setCount] = useState(0);return (<div><p>计数: {count}</p><button onClick={() => setCount(count + 1)}>增加</button></div>);
    };export default Counter;// 使用 useReducer
    import React, { useReducer } from'react';const initialState = { count: 0 };const reducer = (state, action) => {switch (action.type) {case 'increment':return { count: state.count + 1 };default:return state;}
    };const CounterWithReducer = () => {const [state, dispatch] = useReducer(reducer, initialState);return (<div><p>计数: {state.count}</p><button onClick={() => dispatch({ type: 'increment' })}>增加</button></div>);
    };export default CounterWithReducer;
    
  • 避免全局状态滥用:全局状态就像公共资源,大家都能用,但要是用得太多太乱,就会像公共厕所一样,又脏又难管理。所以只把真正需要共享的状态设为全局状态,其他状态尽量放在组件内部管理。

性能监测与调试

  • 使用 React DevTools:这就像一个超级放大镜,能让你清楚地看到组件的状态、props 变化,还能知道组件什么时候重新渲染了。通过它你能找出性能瓶颈,就像医生用放大镜找伤口一样。
  • 分析性能指标:关注一些性能指标,比如首屏加载时间、帧率等。首屏加载时间就像你打开电视,从按下开关到画面出现的时间,越短越好;帧率就像电影的播放速度,越高画面越流畅。可以用浏览器的开发者工具或者专门的性能监测工具来查看这些指标。

代码打包与优化

  • 代码分割:把代码切成小块,就像把大蛋糕切成小块,想吃哪块拿哪块。这样应用启动时不用加载所有代码,只加载必要的部分,能加快启动速度。
  • 压缩代码:压缩代码就像把衣服压缩打包,能让代码文件变小,下载速度变快。可以用工具把代码里的空格、注释等没用的东西去掉。

相关文章:

大白话React第十一章React 相关的高级特性以及在实际项目中的应用优化

假设我们已经对 React 前端框架的性能和可扩展性评估有了一定了解&#xff0c;接下来的阶段可以深入学习 React 相关的高级特性以及在实际项目中的应用优化&#xff0c;以下是详细介绍及代码示例&#xff1a; 1. React 高级特性的深入学习 1.1 React 并发模式&#xff08;Con…...

虚拟机Linux操作(持续更新ing)

虚拟机操作(持续更新ing) 虚拟机基本操作(Linux) # Linux # 立刻关机 poweroff # 立刻关机&#xff0c;可以选择数字或者具体时间 shutdown -h now # 立刻重启&#xff0c;可以选择数字或者具体时间 shutdown -r now # 立刻重启 reboot # cd 切换目录,下面用根目录举例 cd /…...

【开源-线程池(Thread Pool)项目对比】

一些实现**线程池&#xff08;Thread Pool&#xff09;**功能的开源项目的对比分析。 线程池功能的开源项目 项目名称语言优点缺点适用场景开源代码链接ThreadPoolC简单易用&#xff0c;代码简洁&#xff1b;适合快速原型开发。功能较为基础&#xff0c;不支持动态调整线程数…...

JMeter 实战项目脚本录制最佳实践(含 BadBoy 录制方式)

JMeter 实战项目脚本录制最佳实践&#xff08;含 BadBoy 录制方式&#xff09; 一、项目背景 在软件测试过程中&#xff0c;使用 JMeter 进行性能测试和功能测试是常见的操作。本实战项目将详细介绍如何使用 JMeter 自带工具以及 BadBoy 进行脚本录制&#xff0c;并完善脚本以…...

Jackson注解实战:@JsonInclude的妙用

在日常的Java开发中&#xff0c;我们经常需要将Java对象序列化为JSON格式&#xff0c;以便进行数据传输或存储。然而&#xff0c;有时候我们并不希望在JSON中包含某些空值或不必要的字段&#xff0c;这不仅会增加数据的冗余性&#xff0c;还可能对后续的处理造成困扰。Jackson库…...

CAN总线通信协议学习1——物理层

首先来看看CAN是怎么产生的&#xff1a;简单理解&#xff0c;CAN就是一种“拥有特别连接方式”的数据传输的总线&#xff0c;其有特定的一些规则。 &#xff08;注&#xff1a;资料及图片来源于知乎博主TOMOCAT。&#xff09; CAN总线的结构 查阅参考文献&#xff0c;OSI标准…...

Vim 常用快捷键大全:跳转、编辑、查找替换全解析

摘要&#xff1a; Vim 是一款非常强大的文本编辑器&#xff0c;许多程序员和系统管理员都离不开它。 本文详细介绍了 Vim 编辑器中的常用快捷键和命令&#xff0c;从基本模式、光标移动、编辑操作到查找替换&#xff0c;再到文件保存等常用操作&#xff0c;帮助你快速上手并提…...

【Python 数据结构 2.时间复杂度和空间复杂度】

Life is a journey —— 25.2.28 一、引例&#xff1a;穷举法 1.单层循环 所谓穷举法&#xff0c;就是我们通常所说的枚举&#xff0c;就是把所有情况都遍历了的意思。 例&#xff1a;给定n&#xff08;n ≤ 1000&#xff09;个元素ai&#xff0c;求其中奇数有多少个 判断一…...

【Qt QML】QML鼠标事件(MouseArea)

QML鼠标事件全面解析 一、MouseArea基础概念 在 QML 中,鼠标事件是处理用户与界面元素交互的重要部分。QML 提供了多种方式来处理鼠标事件,MouseArea 是 QML 中用于处理鼠标事件的核心元素,它可以覆盖在其他元素之上,捕获鼠标操作并触发相应的信号。 1、基本用法 import …...

LeetCode 202. 快乐数 java题解

https://leetcode.cn/problems/happy-number/description/ 哈希表 class Solution {public boolean isHappy(int n) {if(n1) return true;HashSet<Integer> setnew HashSet<>();while(n!1&&!(set.contains(n))){//没找到结果&#xff1b;没有重复出现过se…...

《认知·策略·跃迁:新能源汽车工程师的深度学习系统构建指南》

--- ## 前言&#xff1a;为什么传统学习法正在杀死你的竞争力&#xff1f; 在新能源汽车领域&#xff0c;我们正经历着每18个月知识体系更新迭代的指数级变革。当磷酸铁锂电池能量密度刚突破200Wh/kg时&#xff0c;固态电池已进入量产倒计时&#xff1b;当自动驾驶还在L2级徘…...

PHP环境安装达梦数据库驱动实操

PHP环境安装达梦数据库驱动实操 一、环境准备 达梦数据库安装 从达梦官网下载对应系统版本的DM8开发版或企业版&#xff0c;完成安装并确保数据库服务正常运行。安装后需记录数据库的安装路径&#xff08;如Windows默认路径为D:\dmdbms&#xff0c;Linux为/dm/server&#xff0…...

Electron + Vite + React + TypeScript 跨平台开发实践指南

Electron Vite React TypeScript 跨平台开发全栈实践指南 开发环境的搭建(node.js&#xff0c;npm的安装)请参见我的文章 2025Q1 核心组件版本矩阵 组件版本关键改进特性Electron30.0.0原生ESM支持、V8引擎性能优化30%Vite6.0.0多核编译加速、SSR增强模式React21.0.0并发…...

Java---入门基础篇(下)---方法与数组

前言 本篇文章主要讲解有关方法与数组的知识点 ,是基础篇的一部分 , 而在下一篇文章我会讲解类和对象的知识点 入门基础篇上的链接给大家放在下面啦 ! Java---入门基础篇(上)-CSDN博客 感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb; 欢迎各位大佬指点…...

【分布式理论11】分布式协同之分布式事务(一个应用操作多个资源):从刚性事务到柔性事务的演进

文章目录 一. 什么是分布式事务&#xff1f;二. 分布式事务的挑战三. 事务的ACID特性四. CAP理论与BASE理论1. CAP理论1.1. 三大特性1.2. 三者不能兼得 2. BASE理论 五. 分布式事务解决方案1. 两阶段提交&#xff08;2PC&#xff09;2. TCC&#xff08;Try-Confirm-Cancel&…...

【文献阅读】Collective Decision for Open Set Recognition

基本信息 文献名称&#xff1a;Collective Decision for Open Set Recognition 出版期刊&#xff1a;IEEE TRANSACTIONS ON KNOWLEDGE AND DATA ENGINEERING 发表日期&#xff1a;04 March 2020 作者&#xff1a;Chuanxing Geng and Songcan Chen 摘要 在开集识别&#xff0…...

Gorm中的First()、Create()、Update()、Delete()的错误处理

一. First() result : tx.Model(&models.Attachment{}).Where("home ? AND home_id ?", attachment.Home, attachment.HomeID).First(&existingAttachment)如果没有查询到数据&#xff0c;result.Error的值是什么&#xff1f; 在使用 GORM&#xff08;…...

【心得】一文梳理高频面试题 HTTP 1.0/HTTP 1.1/HTTP 2.0/HTTP 3.0的区别并附加记忆方法

面试时很容易遇到的一个问题—— HTTP 1.0/HTTP 1.1/HTTP 2.0/HTTP 3.0的区别&#xff0c;其实这四个版本的发展实际上是一环扣一环的&#xff0c;是逐步完善的&#xff0c;本文希望帮助读者梳理清楚各个版本之间的区别&#xff0c;并且给出当前各个版本的应用情况&#xff0c;…...

Navicat连接虚拟机数据库详细教程

Navicat连接虚拟机数据库详细教程 以Windows主机 上的navicat 连接ubuntu虚拟机为例 确认虚拟机ip地址和主机ip地址 主机地址查询 cmd输入ipconfig 登录mysql 创建用户 CREATE USER newuserlocalhost IDENTIFIED BY password; CREATE USER newuser% IDENTIFIED BY passwor…...

委托者模式(掌握设计模式的核心之一)

目录 问题&#xff1a; 举例&#xff1a; 总结&#xff1a;核心就是利用Java中的多态来完成注入。 问题&#xff1a; 今天刷面经&#xff0c;刷到装饰者模式&#xff0c;又进阶的发现委托者模式&#xff0c;发现还是不理解&#xff0c;特此记录。 举例&#xff1a; ​老板​…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

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

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

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...