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

千峰React:Hooks(上)

什么是Hooks

ref引用值

普通变量的改变一般是不好触发函数组件的渲染的,如果想让一般的数据也可以得到状态的保存,可以使用ref

import { useState ,useRef} from 'react'function App() {const [count, setCount] = useState(0)let num = useRef(0)const handleClick = () => {setCount(count + 1)num.current++ //current,当前值console.log(num.current)}return (<div><button onClick={handleClick}>计数</button></div>)
}
export default App

那你就要问了:这和useState有什么区别?

更改时不会触发渲染,例如这里,我们注释掉setCount的语句:

import { useState ,useRef} from 'react'function App() {const [count, setCount] = useState(0)let num = useRef(0)const handleClick = () => {//  setCount(count + 1)num.current++ //current,当前值console.log(num.current)}return (<div><button onClick={handleClick}>计数</button>{count},{num.current}</div>)
}
export default App

可以看出,num的值变了,但是并没有渲染出来

所以我们一般不会把ref写在jsx的结构里,但是可以在渲染过程之外随意修改和更新current的值,不需要像useState一样使用里面的方法修改的值才有效

如果我们在里面开启定时器,在这里一秒触发一次,如果单击按钮,num的值一秒增加一次,如果点击按钮多次,就会同时开启多个定时器,数值就会涨的飞快

import { set } from 'lodash'
import { useState ,useRef} from 'react'function App() {const [count, setCount] = useState(0)let timer=nulllet num = useRef(0)const handleClick = () => {setCount(count + 1)setInterval(() => {console.log(123)}, 1000);}return (<div><button onClick={handleClick}>计数</button>{count},{num.current}</div>)
}
export default App

一般的解决办法是每次新开一个定时器,就关掉旧定时器

import { set } from 'lodash'
import { useState ,useRef} from 'react'function App() {const [count, setCount] = useState(0)let timer=nullconst handleClick = () => {clearInterval(timer)timer=setInterval(() => {console.log(123)}, 1000);}return (<div><button onClick={handleClick}>计数</button>{count}</div>)
}
export default App

但是如果对整个函数重新调用(也就是启用useState)就无法销毁定时器了

因为整个函数重新调用,定时器是在上一次调用产生的,这一次删不掉上一次的定时器,作用域不同

import { set } from 'lodash'
import { useState ,useRef} from 'react'function App() {const [count, setCount] = useState(0)let timer=nullconst handleClick = () => {setCount(count + 1)clearInterval(timer)timer=setInterval(() => {console.log(123)}, 1000);}return (<div><button onClick={handleClick}>计数</button>{count}</div>)
}
export default App

这时候就需要对timer做记忆,也就是使用ref,就算走了多次渲染函数,也可以销毁

import { set } from 'lodash'
import { useState, useRef } from 'react'function App() {const [count, setCount] = useState(0)let timer = useRef(null)const handleClick = () => {setCount(count + 1)clearInterval(timer.current)timer.current = setInterval(() => {console.log(123)}, 1000)}return (<div><button onClick={handleClick}>计数</button>{count}</div>)
}
export default App

试了试,如果timer放全局定义是可以的,但是感觉这样不利于函数的封装性

import { useState, useRef } from 'react'let timer = null
function App() {const [count, setCount] = useState(0)const handleClick = () => {setCount(count + 1)clearInterval(timer)timer = setInterval(() => {console.log(123)}, 1000)}return (<div><button onClick={handleClick}>计数</button>{count}</div>)
}
export default App

通过ref操作原生dom

react里可以使用js的方法操作dom,例如什么querySelector这种css选择器,但是更推荐我们使用React的方法操作dom

import { set } from 'lodash'
import { useState, useRef } from 'react'function App() {const myRef = useRef(null)const handleClick = () => {//通过ref操作原生domconsole.log(myRef.current.innerHTML)myRef.current.style.background = 'red'}return (<div><button onClick={handleClick}>计数</button><div ref={myRef}>hello React</div></div>)
}
export default App

这么写是会报错的,钩子是按顺序使用的,在循环里这么写会报错,所以这么写不符合规范;而且也不建议把const myRef=useRef(null)写在结构里

import { set } from 'lodash'
import { useState, useRef } from 'react'function App() {const list = [{ id: 1, text: 'aaa' },{ id: 2, text: 'bbb' },{ id: 3, text: 'ccc' },]const handleClick = () => {//通过ref操作原生domconsole.log(myRef.current.innerHTML)myRef.current.style.background = 'red'}return (<div>{list.map((item) => {const myRef = useRef(null)return <li key={item.id} ref={myRef}>{item.text}</li>})}</div>)
}export default App

在循环操作里ref可以使用回调函数的写法:

import { useState, useRef } from 'react'function App() {const list = [{ id: 1, text: 'aaa' },{ id: 2, text: 'bbb' },{ id: 3, text: 'ccc' },]return (<div><ul>{list.map((item) => {return (<likey={item.id}ref={(myRef) => {myRef.style.background = 'red'}}>{item.text}</li>)})}</ul></div>)
}export default App

但是我报了很多错,说是

其实就算style在卸载的时候为空,加个逻辑判断就好了

铭记励志轩

import { useState, useRef } from 'react'function App() {const list = [{ id: 1, text: 'aaa' },{ id: 2, text: 'bbb' },{ id: 3, text: 'ccc' },]return (<div><ul>{list.map((item) => {return (<likey={item.id}ref={(myRef) => {if (myRef) {myRef.style.background = 'red'}}}>{item.text}</li>)})}</ul></div>)
}export default App

组件设置ref需要forwardRef进行转发

forwardRef 是 React 提供的一个高阶函数,用于将 ref 从父组件传递到子组件中的 DOM 元素或组件实例。它主要用于解决在函数组件中直接使用 ref 时无法访问子组件内部 DOM 元素的问题。

在 MyInput 组件中,ref 被绑定到 <input> 元素,也就是把ref转发到内部的input身上,然后=在 handleClick 函数中,ref.current 用于直接操作 <input> 元素:

import {  useRef ,forwardRef} from 'react'const MyInput = forwardRef(function MyInput(props, ref) {return (<input type='text' ref={ref}></input>
)
})function App() {const ref = useRef(null)const handleClick = () => {ref.current.focus()ref.current.style.background='red'}return (<div><button onClick={handleClick}>点我</button><MyInput ref={ref} /></div>)
}export default App

useImperativeHandle自定义ref

你想要它其中两个方法:focusscrollIntoView。为此,用单独额外的 ref 来指向真实的浏览器 DOM。然后使用 useImperativeHandle 来暴露一个句柄,它只返回你想要父组件去调用的方法

import {  useRef ,forwardRef,useImperativeHandle} from 'react'const MyInput = forwardRef(function MyInput(props, ref) {const inputRef=useRef(null)useImperativeHandle(ref,()=>{return{focus(){inputRef.current.focus()}}})return (<input type='text' ref={inputRef}></input>
)
})function App() {const ref = useRef(null)const handleClick = () => {
ref.current.focus()}return (<div><button onClick={handleClick}>点我</button><MyInput ref={ref} /></div>)
}export default App

点击按钮获取焦点

然后你就要问了(因为我也想问):这个获取焦点的操作为什么要写成这样?

这样会更加灵活,不用完全写在dom里,可以把你想要写的功能放在useImperativeHandle的第二个参数里,也就是里面的回调函数,来实现你自己的功能、自定义的功能

相当于你自己写了一个组件,可以像普通的组件使用,在里面添加属性和属性值,你也可以写自己的组件实现的功能

例如这个button的属性是他自己自带的,我们写的组件也可以写一些自己带的属性,focusscrollIntoView就是这个作用

 <button onClick={handleClick}>点我</button>

比如我们再添加一个获取焦点以后背景变红色的功能:


import {  useRef ,forwardRef,useImperativeHandle} from 'react'const MyInput = forwardRef(function MyInput(props, ref) {const inputRef=useRef(null)useImperativeHandle(ref, () => {return {focus() {inputRef.current.focus()},focusAndStyle() {inputRef.current.focus()inputRef.current.style.background = 'red'}}})return (<input type='text' ref={inputRef}></input>
)
})function App() {const ref = useRef(null)const handleClick = () => {if (ref) {ref.current.focusAndStyle()}}return (<div><button onClick={handleClick}>点我</button><MyInput ref={ref} /></div>)
}export default App

纯函数如何处理副作用

纯函数之前提过,只关注输入和输出、两次执行函数是否结果一样axios

上面图的意思是:组件是纯函数,但是有时候组件不得不写一些违背纯函数的功能,例如Ajax调用、还有我们用ref操作dom等都是副作用

事件本身可以去除副作用

import { useRef, forwardRef, useImperativeHandle } from 'react'function App() {const ref = useRef(null)//副作用,不符合纯函数的规范//        setTimeout(() => {//     ref.current.focus()// },1000)//副作用,但是符合纯函数的规范,因为事件可以处理副作用const handleClick = () => {ref.current.focus()}return (<div><button onClick={handleClick}>点击</button><input type='text' ref={ref} /></div>)
}export default App

但不是所有的副作用都可以用事件去除,而且有时候需要初始化副作用

所以在react里时间操作可以处理副作用,比如useEffect钩子

import { useRef, forwardRef, useImperativeHandle, useEffect } from 'react'function App() {const ref = useRef(null)//副作用,不符合纯函数的规范//        setTimeout(() => {//     ref.current.focus()// },1000)//副作用,但是符合纯函数的规范,因为事件可以处理副作用//   const handleClick = () => {//     ref.current.focus()//   }//可以在初始的时候进行副作用操作//useEffect触发的时机是jsx渲染后触发的,这样就会消除副作用的影响useEffect(() => {if (ref) {ref.current.focus()}})return (<div><button onClick={handleClick}>点我</button><input type='text' ref={ref} /></div>)
}export default App

一刷新就自动获取焦点

初次渲染和更新渲染,都会触发useEffect(),因为每次渲染jsx以后,会触发useEffect(),整个当前函数组件作用域的最后时机触发的

import {useState,useEffect} from 'react'function App() {const [count, setCount] = useState(0) useEffect(() => {console.log(count)})const handleClick = () => {setCount(count + 1)}return (<div><button onClick={handleClick}>点我</button></div>)
}
export default App

执行顺序:

组件首次渲染(调用 useState(0),初始化 count 为 0,渲染组件返回jsx)->点击按钮(触发handleClick函数调用useCount)->重新渲染组件->执行useEffect中的副作用函数

useEffect的依赖项使用

一个组件里可能有多个副作用,原则上来说多个副作用可以放在同一个useEffect里,但是比较杂

可以使用useEffect的依赖项进行拆解,因为useEffect本身就是个函数

我们可以使用多个useEffect来控制副作用

import {useState,useEffect} from 'react'function App() {const [count, setCount] = useState(0) const [msg, setMsg] = useState('hello React')useEffect(() => {console.log(msg)})useEffect(() => {console.log(count)})const handleClick = () => {setCount(count + 1)}return (<div><button onClick={handleClick}>点我</button></div>)
}
export default App

两个根一个一样,也可以正常的更新、渲染

但是有时候根据不同的应用场景,有些副作用需要重新触发,有的不需要,可以指定哪些可以触发、哪些不可以。

添加useEffect的依赖项目


import {useState,useEffect} from 'react'function App() {const [count, setCount] = useState(0) const [msg, setMsg] = useState('hello React')useEffect(() => {console.log(msg)},[msg])useEffect(() => {console.log(count)},[count])//这就是依赖项const handleClick = () => {setCount(count + 1)}return (<div><button onClick={handleClick}>点我</button></div>)
}
export default App

初始都触发,更新以后,只有对应依赖项发生改变时才触发,像这里msg没改变所以不触发

内部是怎么判别有没有发生变化的?是通过Object.is()方法来判定是否改变

像这样,依赖项是静态的空数组,只有初始会触发,以后发生改变都不会渲染他

不过尽量不要这么写,尽量还是要把里面用到的状态写在依赖项里

除了状态变量,还有props、计算变量等也可以写在依赖项里

计算变量:是指通过其他变量或数据动态计算得出的值,而不是直接存储的静态值。计算变量通常用于根据某些条件或逻辑动态生成数据,而不是手动维护这些数据。

函数也可以做依赖项

函数也可能成为计算变量,所以也可以作为依赖项

但是会出现一个问题,Object.is()方法在判别函数的时候会看引用类型的地址,两个函数是两个函数,内存地址不一样Object.is()就会判别为false

useCallBack可以修复这个问题,可以缓存函数,一般用于组件性能优化,其他情况不推荐使用,这里先不细说

最好的解决办法是把函数定义在useEffect内部

import {useState,useEffect} from 'react'function App() {const [count, setCount] = useState(0) useEffect(() => {const foo = () => {console.log(count)}foo()},[count])//这就是依赖项return (<div></div>)
}
export default App

useEffect清理操作

先写一个简易的关闭聊天室的功能


import {useState,useEffect} from 'react'function Chat() {return (<div>我是聊天室</div>)
}function App() {const [show,setShow] = useState(true)const handleClick = () => {setShow(false)}return (<div><button onClick={handleClick}>点我关闭聊天室</button>{show&&<Chat/>}</div>)
}
export default App

useEffect可以在卸载组件的时候清理

import {useState,useEffect} from 'react'function Chat() {useEffect(() => { console.log('进入聊天室')//useEffect返回一个函数,这个函数会在组件卸载的时候执行return () => {console.log('离开聊天室')}})return (<div>我是聊天室</div>)
}function App() {const [show,setShow] = useState(true)const handleClick = () => {setShow(false)}return (<div><button onClick={handleClick}>点我关闭聊天室</button>{show&&<Chat/>}</div>)
}
export default App

增加了useEffect更新时的清理功能,清理功能是整个作用域的结束,而不是下一次作用域的开始

import {useState,useEffect} from 'react'function Chat({title}) {useEffect(() => { console.log('进入',title)//useEffect返回一个函数,这个函数会在组件卸载的时候执行return () => {console.log('离开',title)}},[title])return (<div>我是课堂</div>)
}function App() {const [show, setShow] = useState(true)const [title,setTitle]=useState('电磁场与电磁波')const handleClick = () => {setShow(false)}const handleChange = (e) => {setTitle(e.target.value)}return (<div><button onClick={handleClick}>点我退出课堂</button><select value={title} onChange={handleChange}><option value="电磁场与电磁波">电磁场与电磁波</option><option value="半导体物理">半导体物理</option></select>{show && <Chat title={title} />}</div>)
}
export default App

清理功能是很常见的需求,如果注释掉清理的代码就会变成这样:

没有退出只有进入,如果是严格模式其实会把函数执行两边,可以看到👇

实际上是违背正常逻辑的,如果加上清理功能,在严格模式执行的现象应该是

也就是说严格模式也可以起到提醒你需要自检的作用

再举一个栗子,如果我们要切换不同的课程,切换不同的课程耗时不同

import {useState,useEffect} from 'react'function fetchChat(title) {const delay = title==='电磁场与电磁波'?2000:1000return new Promise((resolve,reject)=>{setTimeout(() => {resolve([{id:1,text:title+'1'},{id:2,text:title+'2'},{id:3,text:title+'3'}])}, delay);})
}function Chat({ title }) {const [list,setList]=useState([])useEffect(() => { fetchChat(title).then((data) => {setList(data)
})return () => {}},[title])return (<div>{list.map((item)=>{return <li key={item.id}>{ item.text}</li>})}</div>)
}function App() {const [show, setShow] = useState(true)const [title,setTitle]=useState('电磁场与电磁波')const handleClick = () => {setShow(false)}const handleChange = (e) => {setTitle(e.target.value)}return (<div><button onClick={handleClick}>点我退出课堂</button><select value={title} onChange={handleChange}><option value="电磁场与电磁波">电磁场与电磁波</option><option value="半导体物理">半导体物理</option></select>{show && <Chat title={title} />}</div>)
}
export default App

如果不添加useEffect,二者耗时不同,就会出现上一个还在加载,下一个作用域已经执行的问题

变成这样

加入清理,就可以解决问题

import {useState,useEffect} from 'react'function fetchChat(title) {const delay = title==='电磁场与电磁波'?2000:1000return new Promise((resolve,reject)=>{setTimeout(() => {resolve([{id:1,text:title+'1'},{id:2,text:title+'2'},{id:3,text:title+'3'}])}, delay);})
}function Chat({ title }) {const [list, setList] = useState([])useEffect(() => { let ignore = falsefetchChat(title).then((data) => {if (!ignore) {setList(data)//上一次没结束不能提前更新}
})return () => {ignore=true//做清理工作}},[title])return (<div>{list.map((item)=>{return <li key={item.id}>{ item.text}</li>})}</div>)
}function App() {const [show, setShow] = useState(true)const [title,setTitle]=useState('电磁场与电磁波')const handleClick = () => {setShow(false)}const handleChange = (e) => {setTitle(e.target.value)}return (<div><button onClick={handleClick}>点我退出课堂</button><select value={title} onChange={handleChange}><option value="电磁场与电磁波">电磁场与电磁波</option><option value="半导体物理">半导体物理</option></select>{show && <Chat title={title} />}</div>)
}
export default App

有很多人在遇到这样的异步操作时会用async和await,但是React不支持你这么写

你可以单独写一个async函数,然后把要执行的放进去:

import { useState, useEffect } from 'react';function fetchChat(title) {const delay = title === '电磁场与电磁波' ? 2000 : 1000;return new Promise((resolve, reject) => {setTimeout(() => {resolve([{ id: 1, text: title + '1' },{ id: 2, text: title + '2' },{ id: 3, text: title + '3' }]);}, delay);});
}function Chat({ title }) {const [list, setList] = useState([]);useEffect(() => {let ignore = false;const fetchData = async () => {const data = await fetchChat(title);if (!ignore) {setList(data); // 上一次没结束不能提前更新}};fetchData();return () => {ignore = true; // 做清理工作};}, [title]);return (<div>{list.map((item) => (<li key={item.id}>{item.text}</li>))}</div>);
}function App() {const [show, setShow] = useState(true);const [title, setTitle] = useState('电磁场与电磁波');const handleClick = () => {setShow(false);};const handleChange = (e) => {setTitle(e.target.value);};return (<div><button onClick={handleClick}>点我退出课堂</button><select value={title} onChange={handleChange}><option value="电磁场与电磁波">电磁场与电磁波</option><option value="半导体物理">半导体物理</option></select>{show && <Chat title={title} />}</div>);
}export default App;

useEffectEvent

实验性版本提供的钩子

如果你的状态变量有多个,只想执行一个可以用实验版本的useEffectEvent

介于六月份同学说实验版本也用不了,所以不讲了

相关文章:

千峰React:Hooks(上)

什么是Hooks ref引用值 普通变量的改变一般是不好触发函数组件的渲染的&#xff0c;如果想让一般的数据也可以得到状态的保存&#xff0c;可以使用ref import { useState ,useRef} from reactfunction App() {const [count, setCount] useState(0)let num useRef(0)const h…...

设置同一个局域网内远程桌面Ubuntu

1、安装xrdp: 打开终端&#xff0c;运行以下命令来安装xrdp&#xff1a; sudo apt update sudo apt install xrdp 2、启动 XRDP 并设置开机自启 sudo systemctl start xrdp sudo systemctl enable xrdp 3、验证 XRDP 运行状态 sudo systemctl status xrdp 如果显示 active (ru…...

深入 Python:变量与数据类型的奥秘

在 Python 编程的世界里&#xff0c;变量和数据类型是构建程序大厦的基石。它们看似简单&#xff0c;却蕴含着无尽的奥秘和强大的功能。今天&#xff0c;就让我们一起深入探索 Python 中变量与数据类型的奇妙世界。 常量和表达式&#xff1a;数学世界的 Python 映射 在 Pytho…...

LeetCode 718 - 最长重复子数组

LeetCode 718 - 最长重复子数组 是一个典型的数组和字符串问题&#xff0c;适合考察动态规划、滑动窗口和二分查找等多种编程能力。掌握其多种解法及变体能够有效提高处理字符串和数组算法的能力。 题目描述 输入: 两个整数数组 nums1 和 nums2。输出: 两个数组中存在的最长的…...

什么是预训练语言模型下游任务?

问题&#xff1a;Word2Vec模型是预训练模型吗&#xff1f; 由于训练的特性&#xff0c;word2Vec模型一定是与训练模型。给定一个词先使用独热编码然后使用预训练好的Q矩阵得到这个词的词向量。这里指的是词向量本身就是预训练的语言模型。 什么是下游任务&#xff1f; 在自然…...

jvm内存模型,类加载机制,GC算法,垃圾回收器,jvm线上调优等常见的面试题及答案

JVM内存模型 JVM内存模型包括哪些区域 答案&#xff1a;JVM内存模型主要包括以下区域&#xff1a; 程序计数器&#xff1a;是一块较小的内存空间&#xff0c;它可以看作是当前线程所执行的字节码的行号指示器&#xff0c;用于记录正在执行的虚拟机字节码指令的地址。Java虚拟机…...

[Windows] 免费电脑控制手机软件 极限投屏_正式版_3.0.1 (QtScrcpy作者开发)

[Windows] 极限投屏_正式版 链接&#xff1a;https://pan.xunlei.com/s/VOKJf8Z1u5z-cHcTsRpSd89tA1?pwdu5ub# 新增功能(Future)&#xff1a; 支持安卓14(Supports Android 14)提高投屏成功率(Improve the success rate of mirror)加快投屏速度(Accelerate screen mirrorin…...

C++初阶—list类

第一章&#xff1a;list的介绍及使用 1.1 list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指…...

【子网掩码计算器:Python + Tkinter 实现】

子网掩码计算器&#xff1a;Python Tkinter 实现 引言代码功能概述代码实现思路1. 界面设计2. 功能实现3. 事件处理 子网掩码计算器实现步骤1. 导入必要的库2. 定义主窗口类 SubnetCalculatorApp3. 创建菜单栏4. 创建界面组件5. 判断 IP 地址类别6. 计算子网信息7. 其他功能函…...

入门基础项目(SpringBoot+Vue)

文章目录 1. css布局相关2. JS3. Vue 脚手架搭建4. ElementUI4.1 引入ElementUI4.2 首页4.2.1 整体框架4.2.2 Aside-logo4.2.3 Aside-菜单4.2.4 Header-左侧4.2.5 Header-右侧4.2.6 iconfont 自定义图标4.2.7 完整代码 4.3 封装前后端交互工具 axios4.3.1 安装 axios4.3.2 /src…...

Nginx+PHP+MYSQL-Ubuntu在线安装

在 Ubuntu 上配置 Nginx、PHP 和 MySQL 的步骤如下&#xff1a; 1. 更新系统包 首先&#xff0c;确保系统包是最新的&#xff1a; sudo apt update sudo apt upgrade2. 安装 Nginx 安装 Nginx&#xff1a; sudo apt install nginx启动并启用 Nginx 服务&#xff1a; sudo…...

车载以太网-基于linux的ICMP协议

对于车载以太网-ICMP的技术要求: /** ICMP报文格式解析* -----------------* ICMP协议用于网络诊断和错误报告,常见应用包括Ping测试。* ICMP报文结构包括:IP头部、ICMP头部和ICMP数据部分。* 下面详细介绍每个部分的结构、字段的作用以及如何解析它们。* * ICMP头部结构:*…...

虚拟机快照与linux的目录结构

虚拟机快照是对虚拟机某一时刻状态的完整捕获&#xff0c;包括内存、磁盘、配置及虚拟硬件状态等&#xff0c;保存为独立文件。 其作用主要有数据备份恢复、方便系统测试实验、用于灾难恢复以及数据对比分析。具有快速创建和恢复、占用空间小、可多个快照并存的特点。在管理维…...

Unity小功能实现:鼠标点击移动物体

1、功能描述 当玩家点击鼠标时&#xff0c;场景中的物体会移动到鼠标点击的位置。这个功能可以用于控制角色移动、放置物体等场景。 2、实现步骤 创建Unity项目&#xff1a;首先&#xff0c;打开Unity并创建一个新的3D项目。 添加3D物体&#xff1a;在场景中创建一个3D物体&am…...

算法题笔记(自用)——Python

目录 一. 进制&位运算&ASCAII 二. format格式化输出 1. 基本用法 2. 位置参数 3. 格式化数字 4. 对齐和填充 5. 格式化二进制、八进制、十六进制 6. 格式化百分比 7. 格式化科学计数法 8. 格式化字符串字面量&#xff08;f-string&#xff09; 三. 字符串 使…...

爬虫系列之【数据解析之JSON】《三》

目录 前置知识 一、 json.loads()&#xff1a;JSON 转 Python 数据 二、json.dump()&#xff1a;python数据 转 json 并写入文件 三、json.loads() &#xff1a;json 转 python数据 四、json.load() &#xff1a;json 转 python数据&#xff08;在文件操作中更方便&#xf…...

了解Java集合的概念和体系:Collection<T>、Collections与Stream的使用

学习目标 本文知识是对集合层级的介绍&#xff0c;应用开发中实际使用的是他们的子级&#xff0c;感兴趣的小伙伴或者想深入了解有关Java集合知识的朋友可以选择阅读&#xff01; Stream的方法使用使用部分代码块内大多有两种实现方式&#xff0c;是为了更好的理解方法底层的代…...

进程优先级和进程切换 ─── linux第12课

目录 Z(zombie)-僵尸进程 僵尸进程危害 孤儿进程 ​编辑 进程优先级 查看系统进程 用top命令更改已存在进程的nice&#xff1a; 其他概念 进程切换 进程如何切换 进程的调度 进程 内核数据结构 代码和数据 创建进程时 ,先创建内核数据结构 再加载代码和数据 进程退…...

光速解决phpstudy无法启动MySQL服务

问题描述 在初步安装使用phpstudy时&#xff0c;会出现mysql服务启动失败的情况&#xff0c;具体表现为点击一键启动后&#xff0c;mysql启动又立即停止 原因及解决方法&#xff1a; phpstudy数据库无法启动有以下几个原因&#xff0c;可以看看自己是第几种&#xff1a; 服务名…...

深度学习五大模型:CNN、Transformer、BERT、RNN、GAN详细解析

# 深度学习五虎将&#xff1a;当CNN遇见Transformer的奇幻漂流 ## 序章&#xff1a;AI江湖的兵器谱排行 2012年&#xff0c;多伦多大学的厨房里&#xff0c;Hinton的学生们用GPU煎了个"AlexNet"荷包蛋&#xff0c;从此开启了深度学习的热兵器时代。如今五大模型各显…...

txt 转 json 使用python语言

需求: 把如下的txt文档转成json输出 代码 import jsondef txt_to_json(input_file, output_file):data_list []with open(input_file, r, encodingutf-8) as f:for line in f:# 分割数据并去除换行符parts line.strip().split(,)print(f"{parts}")print(type(par…...

FPGA开发,使用Deepseek V3还是R1(4):Deepseek参数配置

​ 以下都是Deepseek生成的答案 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;1&#xff09;&#xff1a;应用场景 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;2&#xff09;&#xff1a;V3和R1的区别 FPGA开发&#xff0c;使用Deepseek V3还是R1&…...

Cargo, the Rust package manager, is not installed or is not on PATH.

今天在Windows操作系统上通过pip 安装jupyter的时候遇到这个报错&#xff0c;Cargo, the Rust package manager, is not installed or is not on PATH.。 解决办法 官网&#xff1a;https://rustup.rs/# 下载&#xff1a;https://win.rustup.rs/x86_64 安装完成之后&#xff0c…...

Go开发框架Sponge+AI助手协同配合重塑企业级开发范式

在互联网高速发展的今天&#xff0c;企业级应用系统面临着日益复杂的业务逻辑和不断增长的开发需求。如何在保证高质量、高效率的前提下快速交付项目&#xff0c;成为了开发者亟需解决的问题。本文将详细介绍如何利用开源的 go 开发框架 Sponge 与 AI 助手协同配合全过程&#…...

从递归到动态规划(三维)

问题描述 假设有一个三维空间的网格&#xff0c;其大小为 m x n x p。我们从坐标 (0, 0, 0) 出发&#xff0c;要到达坐标 (m - 1, n - 1, p - 1)。每次只能在三个方向上移动&#xff1a;向前&#xff08;x 坐标加 1&#xff09;、向右&#xff08;y 坐标加 1&#xff09;或向上…...

JavaWeb个人笔记

技术栈 前端 : HTML CSS JavaScript ES6 Nodejs npm vite vue3 router pinia axios element-plus 后端&#xff1a;HTTP xml Tomcat Servlet Request Response Cookie Sesssion Filter Listener MySQL JDBC Druid Jackson lombok jwt . HTML <!DOCTYPE html> 文档声…...

【vue-echarts】——01.认识echarts

文章目录 前言一、echarts二、使用步骤1.vue cli创建项目并安装第三方模块echarts2.显示图表总结前言 定制的数据可视化图表。ECharts最初由百度团队开源,并于2018年初捐赠给Apache基金会,成为ASF孵化级项目。2021年1月26日晚,Apache基金会官方宣布ECharts项目正式毕业。 一…...

http报文的content-type参数和spring mvc传参问题

很早之前博主聊过HTTP的报文结构以及其中和传参相关的重要参数content-type还有spring mvc&#xff0c;以前的三篇文章&#xff1a; HTTP与HTTPS协议详解&#xff1a;基础与安全机制-CSDN博客 详解Http的Content-Type_content-type application-CSDN博客 如何在Spring Boot中…...

005 公网访问 docker rocketmq

文章目录 创建自定义网络创建NameServer容器创建Broker容器正式开始启动 Nameserver 容器启动 Broker 容器并关联 Nameserverdocker exec -it rmqbroker vi /etc/rocketmq/broker.conf检查 namesrv 解析检查 Broker 注册状态Nameserver 日志Broker 日志检查容器日志手动指定 Br…...

14. LangChain项目实战1——基于公司制度RAG回答机器人

教学视频&#xff1a; 12. 基于Gradio搭建基于公司制度RAG_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV11VXRYTErZ/ 环境配置&#xff1a; python版本&#xff1a;3.10.8 服务器&#xff1a;Ubuntu 依赖包requirements.txt文件内容&#xff1a; aiofiles23.2.1 …...