【React】详细教程
前言
1、react与vue的对比
1.1、什么是模块化
是从代码的角度来进行分析的
把一些可复用的代码抽离为单独的模块;便于项目的维护和开发
1.2、什么是组件化
是从UI界面角度来进行分析的
把一些可复用的UI元素抽离为单独的组件
1.3、组件化的好处
随着项目规模的增大,手里的组件就越来越多;
很方便就能把现有的组件拼接为一个完整的页面
1.4、vue中是如何实现组件化的
通过.vue文件来创建对应的组件
template 结构 script 行为 style 样式
1.5、React如何实现组件化:
React中有组件化的概念,但是并没有像.vue这样的组件模板文件
React中,一切都是以JS来表现的
2、虚拟DOM
2.1、DOM的本质是什么
浏览器中的概念,用js对象来表示页面上的元素,并提供了操作dom对象的api
2.2、什么是React中的虚拟DOM
框架中的概念:用js对象来模拟页面上的DOM和DOM嵌套
2.3、为什么要实现虚拟DOM(虚拟DOM的目的)
为了实现页面中,DOM元素的搞笑更新
一、react简介
1、什么是react
- react 是一个将数据渲染为HTML视图的开源JavaScript库
2、为什么要学react
- 原生JavaScript操作DOM繁琐效率低(DOM-API操作UI)
- 使用JavaScript直接操作DOM,浏览器会进行大量的重绘重排
- 原生JavaScript没有组件化编码方案,代码复用率低
3、react的特点
- 采用组件化模式、声名式编码,提高开发效率及组件复用率
- 命令式编码:命令机器如何去做事情,说一步做一步
- 声名式编码:告诉机器想要什么,机器去想如何去做
- 在 React Native 中可以使用 React 语法进行移动端开发。
- 使用虚拟 DOM+优秀的 Diffing 算法,尽量减少与真实 DOM 的交互
二、react初体验
1、 所需依赖
// crossorigin 没有这个属性的话浏览器会隐藏跨域页面的报错问题
// 加上这个属性可以使浏览器获取到引入脚本中的具体报错// babel.js: ES6转ES5,jsx转js
// react.development.js:react核心库 引入之后全局多了React对象
// react-dom.development.js:react扩展库(帮助操作dom)引入之后全局多了ReactDOM对象<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
2、使用 jsx
- 全称:JavaScript XML
- react 定义的一种类似于 XML 的 js 扩展语法:js+XML
- jsx 是原始 js 创建虚拟 DOM(React.creatElement())的语法糖
- 作用:用来简化创建虚拟 DOM
- 不是字符串,也不是 HTML/XML 标签
- 最终生成的就是一个 js 对象
- jsx 语法规则
- 定义虚拟 DOM 时,不要写引号
- 标签中混入 JS 表达式时要使用 {}
- JS 表达式:一个表达式产生一个值(即有返回值),可放在任何一个需要值的地方
// 1、变量 a // 2、运算表达式 a+b // 3、函数调用表达式 函数默认返回undefined demo(1) // 4、数组的map方法 有返回值 arr.map() // 5、定义一个函数 返回函数本身 function test () {}
- JS语句:js代码块 都没有返回值,只是控制代码走向
if(){}for(){}switch(){case:xxx}
- JS 表达式:一个表达式产生一个值(即有返回值),可放在任何一个需要值的地方
- 样式的类名指定不要用 class,要用 className(为了与es6类区分)
- 内联样式,要用 style={{key:value}} 的形式来写
- 虚拟 DOM 只有一个根标签
- 标签必须闭合
- 标签首字母
- 若大写字母开头,react 就会去渲染对应的组件,若组件没定义,则报错
- 若小写字母开头,则将该标签转为 html 中同名标签,若没有对应标签则报错
- <script type="text/babel"></script>
- 可以使创建虚拟 dom 节点更加的方便
3、虚拟DOM
- 本质是 Object 类型的对象(一般对象)
- 真实 DOM 比虚拟 DOM 重,虚拟 DOM 是 React 内部在用,无需真实 DOM 上那么多属性
- 虚拟 DOM 最终会被 React 转化为真实 DOM,呈现在页面上。
4、模块与组件、模块化与组件化的理解
4.1、js模块(只是对js进行拆分)
- 理解:
- 向外提供特定功能的js程序,一般就是一个js文件
- 为什么要拆成模块:
- 随着业务逻辑增加,代码越来越多且复杂
- 作用:
- 复用js,简化js的编写,提高js运行效率
4.2、组件()
- 理解:
- 用来实现局部功能效果的代码和资源的集合( html/css/js/image 等等 )
- 为什么:
- 一个界面的功能更复杂
- 作用:
- 复用编码,简化项目编码,提高运行效率
4.3、模块化
当应用的js都以模块来编写的,这个应用就是一个模块化的应用
4.4、组件化
当应用是以多组件的方式实现,这个应用就是一个组件化应用
三、React面向组件编程
1、组件详解
1.1、函数式组件
- 函数定义的组件(适用于简单组件的定义)
<script type="text/babel">function Demo() {// babel翻译之后打开严格模式,this不能指向window,变为undefinedconsole.log("this", this);return <h1>函数组件</h1>;}ReactDOM.render(<Demo />, document.getElementById("app"));// 执行了ReactDOM.render之后发生了什么?// 1、React解析组件标签,找到了Demo组件// 2、发现组件是使用函数定义的,随后调用该函数// 3、将返回的虚拟DOM转为真实DOM,随后呈现在页面中</script>
1.2、类组件
- 使用es6 class 类定义的组件(适用于复杂组件)
<script type="text/babel">// 使用类组件一定要继承React.Componentclass MyComponent extends React.Component {// 构造器不是必须的// 但一定要有render并且有返回值render() {// 虽然我们没有手动new MyComponent()进行实例化,但是ReactDOM.render帮我们做了实例化操作// 所以 此处 render存在于MyComponent的原型对象上,供实例使用 // 此处 render中的this指向MyComponent的实例对象console.log("render中的this", this); // 指向MyComponent的实例对象 MyComponent{...}return <h1>我是用类定义的组件(使用与【复杂组件】的定义)</h1>;}}// 渲染组件到页面;ReactDOM.render(<MyComponent />, document.getElementById("app"));//执行了ReactDOM.render(<MyComponent />, ...))之后,发生了什么?// 1、React解析组件标签,找到了MyComponent组件// 2、发现组件是使用类定义的,随后new出来该类的实例,并通过该实例调用到原型上的render方法// 3、将render返回的虚拟DOM转为真实DOM,随后呈现在页面中</script>
2、组件实例的三大特性(类组件/ hooks)
2.1、state
2.1.1、理解
- state 是组件对象最重要的属性,值是对象
- 组件被称为“状态机”,通过更新组件的 state 来更新对应的页面显示(重新渲染组件)
2.1.2、强烈注意
- 组件中 render 方法中的this为组件实例对象
- 组件自定义的方法中 this 为 undefined,如何解决?
- 强制绑定 this ;通过函数对象的 bind()
- 箭头函数
- 状态数据,不能直接修改或更新
<script type="text/babel">// 创建组件class MyComponent extends React.Component {// 构造器调用几次? 1次constructor(props) {super(props);// 初始化状态this.state = {isHot: false,};// this指向的解决办法// 左边的this.changeWeather是当前类的changeWeather变量// 右边的this.changeWeather是类原型对象上的方法,将其this指向到当前类this.changeWeather = this.changeWeather.bind(this);}// render调用几次? 1+n次,1是初始化,n是状态更新的次数render() {// render存在于MyComponent类的原型对象上// render由MyComponent的实例调用,this指向MyComponent的实例对象// 读取状态const { isHot } = this.state;console.log("render中的this", this); // 指向MyComponent的实例对象 MyComponent{...}// onClick 不是html dom事件onclick 不能与原生事件相比较// 此处 实际上是将实例上的changeWeather方法赋值给onClick// 然后通过onClick去直接调用changeWeather事件,此时this指向就不是实例了return (<h1 onClick={this.changeWeather}>今天的天气{isHot ? "炎热" : "凉爽"}</h1>);}// changeWeather调用几次? 点几次调几次changeWeather() {// changeWeather 是在实例的原型对象上,供实例使用// 由于changeWeather是作为onClick的回调,所以不是通过实例调用的,是直接调用// 类中的方法默认开启局部的严格模式,所以chagneWeather中的this为undefinedconsole.log("changeWeather", this);// 严重注意:状态必须通过setState进行更新,且更新是一种合并,不是替换// setState是合并的操作不会影响state中其他属性,不是替换this.setState({ isHot: !this.state.isHot });}}// 渲染组件到页面;ReactDOM.render(<MyComponent />, document.getElementById("app"));// ReactDOM.render都做了写什么;// 1、先判断传入的组件标签// 是小写就对应html中的标签进行渲染// 是大写就判断是否是函数组件或类组件// 是函数组件就找到对应的函数组件进行渲染// 是类组件就先实例化,然后使实例化调用原型上的render方法渲染// 将返回的虚拟dom树转换为真实dom数</script>
2、props
2.1、类组件接收props值
<script type="text/babel">class Person extends React.Component {// 构造器作用只有两个// 1、初始化数据状态(可以简写)// 2、给事件绑定this对象(可以用赋值语句+箭头函数来简写)// 结论:能省略就省略constructor(props) {// 构造器是否接收props,是否传递给super,取决于是否希望在构造器中通过this访问propssuper(props);console.log("props", props);// super中传递props之后可以用this.props访问propsconsole.log("this.props", this.props);}render() {const { name, age, sex } = this.props;return (<ul><li>{name}</li><li>{sex}</li><li>{age + 1}</li></ul>);}}let data = { name: "cz", age: "18", sex: "男" };// js中属性对象是不能直接展开的,但是在react中有babel和react核心库对其进行了处理,所以这里可以直接用展开符将对象展开ReactDOM.render(<Person {...data} />, document.getElementById("app"));ReactDOM.render(<Person name="xp" age="16" sex="女" />,document.getElementById("app"));</script>
2.2、函数组件接收props值
<script type="text/babel">function Person(props) {const { name, sex, age } = props;return (<ul><li>{name}</li><li>{sex}</li><li>{age + 1}</li></ul>);}let data = { name: "cz", age: 18, sex: "男" };// js中对象是不能直接展开的,但是在react中有babel和react核心库对其进行了处理,所以这里可以直接用展开符将对象展开ReactDOM.render(<Person {...data} />, document.getElementById("app1"));ReactDOM.render(<Person name="xp" age={16} sex="女" />,document.getElementById("app2"));</script>
2.3、refs (不要过度使用 ref )
- 理解
- 组件内的标签可以通过 ref 来标识自己(可替代id)
- 写法
- 字符串写法
//字符串写法 不推荐(过时,未来会移除) //字符串写法会产生一些问题(效率不高) <input ref="input1" type="text" placeholder="请输入" /> // 获取 this.refs.input1
- 回调函数写法
- 第一种内联方式
<script type="text/babel">class Demo extends React.Component {showData = () => {console.log(this);// 如果写的refs的回调写法,则node节点直接赋值给了实例的input1变量上// 就不能再通过refs上取了 const { input1 } = this.refs;// 直接在实例上取const { input1 } = this;alert(input1.value);};showData2 = () => {const { input2 } = this;alert(input2.value);};render() {return (<div>{/*1、执行render函数之后会执行render函数中的jsx语句2、遇到jsx中ref为回调写法则会触发里边的回调(特定标签的回调才会被react处理,随便写个标签的表达式会被处理,但回调不会,而且还会报错 例如:xxx={()=>{...}})错误3、在此处会触发一个箭头函数4、运行箭头函数则将箭头函数中的参数(这个参数就是当前节点由react处理)赋值给this.input15、因为是箭头函数本身没有this,会向上找到render的this 即当前实例6、所以此处是将当前node节点赋值给实例的input1变量上*/}<inputref={(currentNode) => {this.input1 = currentNode;}}type="text"placeholder="点击按钮提示数据"/><button style={{ margin: "0 10px" }} onClick={this.showData}>点击提示左侧输入框内容</button>{/* 此处为refs回调写法的简写方式 */}<inputonBlur={this.showData2}ref={(c) => (this.input2 = c)}type="text"placeholder="失去焦点提示数据"/></div>);}}ReactDOM.render(<Demo />, document.getElementById("app1"));</script>
- 第二种类绑定方法
<script type="text/babel">class Demo extends React.Component {state = { isHot: true };showInfo = () => {const { input1 } = this;alert(input1.value);};changeWeather = () => {const { isHot } = this.state;this.setState({isHot: !isHot,});};saveInput = (currentNode) => {console.log("currentNode", currentNode);};render() {const { isHot } = this.state;return (<div><h2>今天天气很{isHot ? "炎热" : "凉爽"}</h2>{/*1、此处为内联写法(直接将执行的代码放在回调函数里的方式)2、这样的写法会导致 每次更新(除去第一次render)render时,会重新加载当前函数会执行两次,第一次会把参数赋值为null,第二次才会将当前dom节点绑定上3、对实际代码不会产生影响,依旧可以使用*/}<inputref={(currentNode) => {this.input1 = currentNode;console.log("我被调用了", currentNode);}}type="text"/><button onClick={this.showInfo}>点击提示输入的数据</button><button onClick={this.changeWeather}>点击我改变天气</button>{/*此处为类绑定回调此方法可以避免ref加载两次的问题*/}<input ref={this.saveInput} type="text" /></div>);}}ReactDOM.render(<Demo />, document.getElementById("app1"));</script>
- 第三种 createRef (最推荐的方式)
<script type="text/babel">class Demo extends React.Component {// React.createRef调用后可以返回一个容器// 该容器可以存储被ref所表示的节点// 该容器为专人专用,只能存一个,后边的会覆盖当前的myRef = React.createRef();showData = () => {console.log("myRef", this.myRef); // {current: input}};render() {return (<div><inputref={this.myRef}type="text"placeholder="点击按钮提示数据"/><button style={{ margin: "0 10px" }} onClick={this.showData}>点击提示左侧输入框内容</button></div>);}}ReactDOM.render(<Demo />, document.getElementById("app1"));</script>
- 第一种内联方式
- 事件处理
- 通过 onXxx 属性指定事件处理函数(注意大小写)
- React 使用的是自定义(合成)事件,而不是使用的原生 DOM 事件 -----为了更好的兼容性
- React 中的事件是通过事件委托方式处理的(委托给组件最外层的元素)----为了高效
- 通过 event.target 得到发生时间的 DOM 元素对象----不要过度使用ref
- 当发生事件的元素刚好是我们需要获取的元素就可以不用写 ref 了
- 通过 onXxx 属性指定事件处理函数(注意大小写)
- 字符串写法
3、收集表单数据
- 非受控组件
- 受控组件
- 表单里所有输入类的 dom 在输入的同时能够拿到输入的值
4、高阶函数、柯里化
4.1、高阶函数
- 如果一个函数符合下面2个规范中的任何一个,那该函数就是高阶函数。
- 若A函数,接收的参数是一个函数,那么A就可以称之为高阶函数
- 若A函数,调用的返回值依然是一个函数,那么A就可以称之为高阶函数
- 常见的高阶函数
- promise
- setTimeout
- 数组常见方法 map reduce forEach
4.2、函数柯里化
- 通过函数调用继续返回函数的方式,实现多次接收参数最后统一处理的函数编码形式
5、生命周期
5.1、理解
- 组件从创建到死亡他会经历一些特定的阶段
- React 组件中包含一系列狗子函数生命周期回调函数,会在特定时刻调用
- 我们在定义组件时,会在特定的生命周期回调函数中做特定的工作
5.2、生命周期流程(旧)
- 初始化阶段:由 ReactDOM.render() 触发-----初次渲染
- constructor
- componentWillMount()
- render()
- componentDidMount() -----常用
- 一般在这个钩子中做初始化的事
- 开启定时器
- 发送网络请求
- 订阅消息
- 一般在这个钩子中做初始化的事
- 更新阶段:由组件内部 this.setState() 或父组件 render 触发
- shouldComponentUpdate()
- componentWillUpdate()
- render()
- componentDidUpdate()
- 卸载组件:由 ReactDOM.unmountComponentAtNode() 触发
- componentWillUnmount() -----常用
- 一般在这个钩子中做一些收尾的事
- 关闭定时器
- 取消订阅消息
- 一般在这个钩子中做一些收尾的事
- componentWillUnmount() -----常用
- 组件接收新的 props 钩子 (第一次接收的不算)
- componentWillReceiveProps()
5.3、生命周期(新)
- 所有带 will 的钩子除了即将卸载的钩子都要加 UNSAFE_ 前缀
- 这些还是之前的钩子,以后即将废弃,增加它们现在的使用成本
- componentWillMount() ----> UNSAFE_componentWillMount()
- componentWillUpdate() ----> UNSAFE_componentWillUpdate()
- componentWillReceiveProps() ----> UNSAFE_componentWillReceiveProps()
- 增加了2个新的钩子
- getDerivedStataeFromProps
- getSnapshotBeforeUpdate
- 初始化阶段:由 ReactDOM.render() 触发 ---- 初次渲染
- constructor()
- getDerivedStateromProps()
- render()
- componentDidMount() ===> 常用
- 一般在这个钩子中做一些初始化的事情
- 开启定时器
- 发送网络请求
- 订阅消息
- 一般在这个钩子中做一些初始化的事情
- 更新阶段:由组件内部 this.setState() 或父组件重新render触发
- getDerivedStateFromProps()
- shouldComponentUpdate()
- render()
- getSnapshotBeforeUpdate()
- componentDidUpdate()
- 卸载组件:由 React.unmountComponentAtNode() 触发
- componentWillUnmount() ====》 常用
- 一般在这个钩子中做一些首尾的事情
- 关闭定时器
- 取消订阅消息
- 一般在这个钩子中做一些首尾的事情
- componentWillUnmount() ====》 常用
6、diff算法
7、React 发送网络请求
- 跨域
三、React路由
1、SPA的理解
- 单页Web应用(single page web application,SPA)。
- 整个应用只有一个完整的页面。
- 点击页面中的链接不会刷新页面,只会做页面的局部更新
- 数据都需要通过ajax请求获取, 并在前端异步展现。
2、路由的理解
- 什么是路由?
- 一个路由就是一个映射关系( key:value )
- key 为路径, value 可能是 function 或 component
- 路由分类
- 后端路由
- 理解: value 是 function , 用来处理客户端提交的请求。、
- 注册路由: router.get(path, function(req, res))
- 工作过程:当 node 接收到一个请求时, 根据请求路径找到匹配的路由, 调用路由中的函数来处理请求, 返回响应数据
- 前端路由
- 浏览器端路由,value 是 component,用于展示页面内容。
- 注册路由:
- 工作过程:当浏览器的 path 变为 /test 时, 当前路由组件就会变为 Test 组件
- 后端路由
3、路由的基本使用
- 明确好界面中的导航区,展示区
- 导航区的a标签改为Link标签
// to后边写的为组件对应的域名后想要显示的名字
<Link to='/Demo'>Demo</Link>
- 展示区写Route标签进行路径的匹配
// 要先引入Demo组件
import Demo from './components/demo'
// 只要跟link中的to后的path对应上就渲染
<Route path='/Demo' component={Demo}>
- 的最外侧包裹了一个或标签
- 所有的路由只能被同一个路由标签包裹才能起到匹配渲染的作用
4、路由组件与一般组件
- 写法不同
- 一般组件
- 可以通过 export default withRouter(组件名) 方式修改为路由组件
- 路由组件:
- 一般组件
- 存放位置不同
- 一般组件: components
- 路由组件: pages
- 接受props不同
- 一般组件:写组件时传递什么接收什么
- 路由组件:接收到路由信息 有三个固定属性
- history
- location
- match
5、NavLink 与 封装NavLink
- NavLink可以实现路由链接的高亮,通过activeClassName属性来指定高亮样式名
- 标签体内容是一个特殊的标签属性
- 通过this.props.children可以获取标签体内容
6、switch的使用
- 通常情况写,path 和 component 是一一对应的关系
- Switch标签包裹Route 标签可以提高路由匹配效率(匹配上一个就不往下进行了)
7、解决多级路径刷新页面样式丢失的问题
- publich/index.html 中 引入样式时 路径 ./ 修改为 / (常用)
- publich/index.html 中 引入样式时不写 ./ 写 %PUBLIC_URL% (常用)(react脚手架里)
- 使用HashRouter
8、路由的严格匹配与模糊匹配
- 默认使用的是模糊匹配(简单记:【输入的路径】必须包含要【匹配的路径】且顺序要一致)
- 开启严格匹配:
- 严格模式不要随便开启,需要再开,有些时候开启会导致无法继续匹配二级路由
9、Redirect的使用
- 一般所有的路由注册的最下方,当所有路由都无法匹配时,跳转到Redirect指定的路由
- 具体编码:
<Switch><Route path="/cz/home" component={Home}></Route><Route path="/about" component={About}></Route><Redirect to="/cz/home" /></Switch>
10、嵌套路由
- 注册子路由是要写上副路由的path值
- 路由的匹配是按照注册路由的顺序进行的
11、向路由组件传递参数
- params参数
// 路由链接(携带参数)
<Link to='/detail/03/cz'>详情</Link>
// 注册路由(声明接收)
<Route path="/detail/:id/:name"></Route>
// 接收参数
const {id,name}= this.props.match.params
12、search参数
// 路由链接(携带参数)<Link to="/home/news?id=03&name=cz">news</Link>// 注册路由(无需声明接收)<Route path="/home/news" component={News}></Route>// 接收参数(获取到的为urlencoded编码字符串,可通过qs.parse解析)const {search} = this.props.locationconst searchQuery = qs.parse(search.slice(1))
13、state参数
// 路由链接(携带参数)<Link to={{pathname:'/home/detail',state:{id:'03',name:'cz'}}}>news</Link>// 注册路由(无需声明接收)<Route path="/home/detail" component={Detail}></Route>// 接收参数(获取到的为urlencoded编码字符串,可通过qs.parse解析)const {state} = this.props.location
14、编程式路由导航
- 借助this.props.history对象上的API对操作路由跳转、前进、后退
this.props.history.push()
this.props.history.replace()
this.props.history.goBack()
this.props.history.goForward()
this.props.history.go()
15、BrowserRouter 与 HashRouter 的区别
- 底层原理不一样:
- BrowserRouter使用的是H5的 history API,不兼容IE9以下的版本
- HashRouter使用的是URL的哈希值
- url 表现形式不一样
- BrowserRouter 的路径中没有#
- HashRouter 使用的是URL的哈希值
- 刷新后对路由state参数的影响
- BrowserRouter 没有任何影响,因为state保存在history对象中
- HashRouter 刷新后会导致路由 state 参数的丢失!!!
- 备注:HashRouter 可以用于解决一些路径错误相关的问题
四、Redux
1、Redux是什么
- redux是一个专门用于做状态管理的JS库(不是react插件库)。
- 它可以用在react, angular, vue等项目中, 但基本与react配合使用。
- 作用: 集中式管理react应用中多个组件共享的状态。
2、什么情况下需要使用redux
- 某个组件的状态,需要让其他组件可以随时拿到(共享)。
- 一个组件需要改变另一个组件的状态(通信)。
- 总体原则:能不用就不用, 如果不用比较吃力才考虑使用。
3、redux工作流程
4、redux的三个概念
4.1、action
- 动作的对象
- 包含2个属性
- type:标识属性,值为字符串,唯一,必要属性
- data:数据属性,值类型任意,可选属性
- 例子
{type:'add',data:{name:'cz',age:18} }
4.2、reducer
- 用于初始化状态,加工状态
- 加工时,根据旧的 state 和 action ,产生新的 state 的纯函数
- 纯函数:
- 只要有同样的输入,必定得到同样的输出
- 必须遵守以下约束
- 不能改写参数数据
- 不会产生任何副作用,例如网络请求,输入和输出设备
- 不能调用 Date.now() 或者 Math.random() 等不纯的方法
- 为什么 reducer 要是一个纯函数
- 首先 reducer 被设计出来是为了接受一个旧 state 和 action 返回一个新的 state 的过程
- 如果使用不纯的函数,那么返回的 state 将无法被保障
- 比如 value=getValue+1;getValue 是一个请求,如果清楚出现错误,那么返回的state 将变得无法确定,前端拿到的数据也不确定,就失去了作为 reducer 的价值
4.3、store
- 将 state、action、reducer 联系在一起的对象
5、 redux使用
5.1、去除组件自身的状态
5.2、创建store.js
- 引入redux中的createStore函数,创建一个store
- createStore调用时要传入一个为起服务的reducer
- 暴露store对象
- 创建reducer.js
- reducer的本质是一个函数,接受preState,action两个参数,返回加工后的状态
- reducer有两个作用:
- 初始化状态
- 加工状态
- reducer第一次被调用时,是store自动触发的,传递的preState是undefined
- 在入口文件js中检测store中状态的改变,一旦发生改变重新渲染
- 备注:redux只负责管理状态,至于状态的改变驱动页面的展示,要靠我们自己写
import store from '../redux/store'
// 监听store状态变化
store.subscribe(()=>{ReactDOM.render(<App />,document.getElementById('root'))})
6、redux 异步使用
- 明确延迟的动作不想交给组件自身,想交给action去处理
- 何时需要异步action
- 想要对状态进行操作,但是具体的数据靠异步任务返回
- 创建action的函数不再返回一个一般对象,而是返回一个函数,在该函数中写异步任务
- 异步任务有结果后,分发一个同步的action去真正操作数据
- 备注:异步action不是必须要写的,完全可以自己等待异步任务的结果再去分发action。
- 具体步骤
- 需要在store页面中引入applyMiddleware方法去解析中间件
- 下载并引入react-thunk中间件去解析action返回的函数
store.js
// 该问见专门用于暴露一个store对象,整个应用只有一个store对象
// 引入createStore,用来创建redux中最为核心的store对象
// 引入 applyMiddleware ,用来处理中间件
import { createStore,applyMiddleware } from 'redux'
// 引入为count组件服务的reducer
import countReducer from './count_reducer.js'
// 引入可以处理action为函数的异步方法的中间件redux-thunk
import thunk from 'redux-thunk'
export default createStore(countReducer,applyMiddleware(thunk))action.js
// action为一个方法时,为异步, store不认识为函数的action,需要用中间件去处理
export const actionAsyncAdd = (data,time) => {// store会在调用该方法时将dispath传入return (dispatch)=>{setTimeout(()=>{dispatch(actionAdd(data))},time)}
}
7、react-redux 使用
7.1、原理图
7.2、react-redux使用
- 创建store 同 Redux 方式一样,全局有且只有一个store
- 在容器外部用包裹并传入store
- 传入的store可以在connect中传入的第一个函数内获取到
- 引入react-redux中的connect方法包装子组件形成父子关系,并暴露
export default connect(state => ({ count: state.count }), // 接收store中的数据{jia: ()=>{}, // 传入操作数据状态的方法jian: ()=>{},})(Count); // 将子组件传入
- 子组件中通过 props 来获取和操作 connect 传递的数据和方法
- react-redux 优化
- 容器组件和UI组件整合成一个文件
- 无需自己给容器组件传递 store,给包裹一个即可
- 使用了 react-redux 后不用自己检测 redux 中状态的改变,容器组件可以自动完成这个工作
- mapDispatchToProps 也可以简写成一个对象
- 一个组件要和redux“打交道”需要经过哪几步?
- 定义好UI组件
- 引入 connect 生成一个容器组件并暴露,写法如下
connect(state=>({key:value}) //映射状态{key:xxxxAction} //映射的操作状态的方法 )(UI组件)
-
在UI组件中通过this.props.xxxx 读取和操作状态
8、reducer 合并 数据共享
// 该问见专门用于暴露一个store对象,整个应用只有一个store对象
// 引入createStore,用来创建redux中最为核心的store对象
// 引入 applyMiddleware ,用来处理中间件
// 引入 combineReducers,用来合并reducer
import { createStore,applyMiddleware,combineReducers } from 'redux'
// 引入为count组件服务的reducer
import countReducer from './count_reducer.js'
// 引入为person组件服务的reducer
import personReducer from './person_reducer.js'const allReducers = combineReducers({count:countReducer,personReducer:personReducer
})// 引入可以处理action为函数的异步方法的中间件redux-thunk
import thunk from 'redux-thunk'
// 将合并后的reducers交给store
export default createStore(allReducers,applyMiddleware(thunk))
- 定义一Person组件,和 Count 组件通过 redux 共享数据
- 为 Person 组件编写 reducer,action
- 重点:Person 的 reducer 和 Count 的 reducer 要使用 combineReducers 进行合并,合并后的总状态是一个对象!!!
- 交给 store 的是总 reducer,最后注意在组件中取出状态的时候,记得“取到位”
五、react扩展
1、setState
1.1、第一种写法:setState( {key:value} , [callback] ) ---对象式写法
- setState是个同步方法,但是setState调用后引起的react状态更新是异步的
- setState第二个可选的回调参数
- 它在状态更新完毕、界面也更新后(render调用后)才被调用
1.2、第二种写法: setState( updater, [callback] ) -----函数式写法
- updater为一个返回一个更改对象的函数
- updater可以接受到 state 和 props 两个参数
- callback是可选的回调函数,它在状态更新,界面也更新后(render调用后)才被调用
- 什么时候表现“同步”什么时候表现“异步”
- setState内部有合并修改的策略,为的就是优化性能,这一策略导致setState之后渲染会出现异步的情况
- 所以当我们使用react可以控制的api的时候,都将体现出“异步”的情况
- react 生命周期,react事件,等等
- 当我们使用react无法控制的api就可以脱离setState合并修改的操作,使setState变为同步操作
- setTimeout , promise.then,ajax,绑定原生事件
2、lazyLoad
2.1、路由组件的lazyLoad
//1.通过React的lazy函数配合import()函数动态加载路由组件 ===> 路由组件代码会被分开打包const Login = lazy(()=>import('@/pages/Login'))//2.通过<Suspense>指定在加载得到路由打包文件前显示一个自定义loading界面<Suspense fallback={<h1>loading.....</h1>}><Switch><Route path="/xxx" component={Xxxx}/><Redirect to="/login"/></Switch></Suspense>
3、Hooks
3.1、React Hook/Hooks是什么?
- Hook是React 16.8.0版本增加的新特性/新语法
- 可以让你在函数组件中使用 state 以及其他的 React 特性
3.2、 三个常用的Hook
- State Hook: React.useState()
- Effect Hook: React.useEffect()
- Ref Hook: React.useRef()
3.3、 State Hook
- State Hook让函数组件也可以有state状态, 并进行状态数据的读写操作
- 语法: const [xxx, setXxx] = React.useState(initValue)
- useState() 说明:
- 参数: 第一次初始化指定的值在内部作缓存
- 返回值: 包含2个元素的数组, 第1个为内部当前状态值, 第2个为更新状态值的函数
- setXxx()2种写法:
- setXxx(newValue): 参数为非函数值, 直接指定新的状态值, 内部用其覆盖原来的状态值
- setXxx(value => newValue): 参数为函数, 接收原本的状态值, 返回新的状态值, 内部用其覆盖原来的状态值
3.4、Effect Hook
- Effect Hook 可以让你在函数组件中执行副作用操作(用于模拟类组件中的生命周期钩子)
- React中的副作用操作:
- 发ajax请求数据获取
- 设置订阅 / 启动定时器
- 手动更改真实DOM
- 语法和说明:
useEffect(() => {// 在此可以执行任何带副作用操作return () => { // 在组件卸载前执行// 在此做一些收尾工作, 比如清除定时器/取消订阅等}}, [stateValue]) // 如果指定的是[], 回调函数只会在第一次render()后执行
- 可以把 useEffect Hook 看做如下三个函数的组合
- componentDidMount()
- componentDidUpdate()
- componentWillUnmount()
3.5、Ref Hook
- Ref Hook可以在函数组件中存储/查找组件内的标签或任意其它数据
- 语法: const refContainer = useRef()
- 作用:保存标签对象,功能与React.createRef()一样
4、Fragment
使用:
<Fragment><Fragment><></>
作用: 可以不用必须有一个真实的DOM根标签了
5、Context
理解:
> 一种组件间通信方式, 常用于【祖组件】与【后代组件】间通信
使用
- 创建Context容器对象:
- const XxxContext = React.createContext()
- 渲染子组时,外面包裹 xxxContext.Provider , 通过 value 属性给后代组件传递数据:
<xxxContext.Provider value={数据}>子组件</xxxContext.Provider>
- 后代组件读取数据:
- 第一种方式:仅适用于类组件
- static contextType = xxxContext // 声明接收context
- this.context // 读取context中的value数据
- 第二种方式: 函数组件与类组件都可以
<xxxContext.Consumer>{value => ( // value就是context中的value数据要显示的内容)} </xxxContext.Consumer>
- 第一种方式:仅适用于类组件
注意
在应用开发中一般不用context, 一般都用它的封装react插件
6、组件优化
6.1、Component的2个问题
- 只要执行setState(),即使不改变状态数据, 组件也会重新render() ==> 效率低
- 只当前组件重新render(), 就会自动重新render子组件,纵使子组件没有用到父组件的任何数据 ==> 效率低
6.2、效率高的做法
只有当组件的state或props数据发生改变时才重新render()
原因:
Component中的shouldComponentUpdate()总是返回true
解决:
办法1:
重写 shouldComponentUpdate() 方法
比较新旧 state 或 props 数据, 如果有变化才返回 true , 如果没有返回 false
办法2:
使用 PureComponent
PureComponent 重写了 shouldComponentUpdate() , 只有 state 或 props 数据有变化才返回 true
注意:
只是进行state和props数据的浅比较, 如果只是数据对象内部数据变了, 返回false
不要直接修改state数据, 而是要产生新数据
项目中一般使用PureComponent来优化
7、组件通信方式总结
7.1、组件间的关系:
- 父子组件
- 兄弟组件(非嵌套组件)
- 祖孙组件(跨级组件)
7.2、几种通信方式:
- props:
- children props
- render props
- 消息订阅-发布:
- pubs-sub、event等等
- 集中式管理:
- redux、dva等等
- conText:
- 生产者-消费者模式
7.3、 比较好的搭配方式:
- 父子组件:props
- 兄弟组件:消息订阅-发布、集中式管理
- 祖孙组件(跨级组件):消息订阅-发布、集中式管理、conText(开发用的少,封装插件用的多)
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 2022-2028年中国儿童家具行业市场竞争态势及发展趋向分析报告
报告类型:产业研究 报告格式:电子版、纸介版 出品单位:智研咨询-产业信息网 国外儿童家具市场发展较早,成熟度较高,品类较为丰富。在国外儿童家具的定义上,儿童家具不仅仅是儿童床、儿童衣柜、儿童书桌、…...
2024/4/28 2:17:40 - SpringBoot读取上传Excel的数据(3)
SpringBoot读取上传Excel的数据(3) ExcelUtil(hutool工具的简单使用) public class ExcelUtil extends ObjectExcel工具类,不建议直接使用index直接操作sheet,在wps/excel中sheet显示顺序与index无关,还有隐藏sheet 修饰符和类型方法和说明…...
2024/4/28 20:07:05 - 2022-2028年中国云终端行业市场深度分析及投资前景展望报告
报告类型:产业研究 报告格式:电子版、纸介版 出品单位:智研咨询-产业信息网 智研咨询发布的《2022-2028年中国云终端行业市场深度分析及投资前景展望报告》共十二章。首先介绍了云终端行业市场发展环境、云终端整体运行态势等,接…...
2024/4/28 2:49:54 - 快速选择算法
六.快速选择算法(在一个数组里查找第k小的数字 在一个数组里实现快速选择。首先执行快速排序的前两步,得到以分界点为界的左右两个区间,然后比较左区间中数的个数与k的大小,如果小,说明第k小的数在左区间里面…...
2024/4/28 4:09:06 - 2022版中国盐酸羟胺项目可行性研究报告
2022版中国盐酸羟胺项目可行性研究报告 第一章 盐酸羟胺项目总论 1.1盐酸羟胺项目概况 1.1.1盐酸羟胺项目名称 1.1.2盐酸羟胺项目建设单位 1.1.3盐酸羟胺项目拟建设地点 1.1.4盐酸羟胺项目建设内容与规模 1.1.5盐酸羟胺项目性质 1.1.…...
2024/4/28 21:17:51 - 应用数据库软件的典型架构有哪些
分层架构,经典MVC架构: 第一层:Presentation Layer表现层 第二层:Business Layer业务层 第三层:Persistence Layer持久层 第四层:Database Layer数据库 事件驱动架构: 可以把中间白色长条中的Ev…...
2024/4/28 6:36:03 - 代理模式和装饰者模式的区别
装饰者模式和代理模式的区别 前言 这个问题其实是在面试字节的时候,面试官提出来的问题。刚听到这个问题的时候一脸懵,这不是两种设计模式吗?根本没什么关联呀!这是要问啥,后来仔细回想了装饰者模式和代理模式&#…...
2024/4/13 8:31:30 - python给邮箱自动发送内容
import yagmail 链接邮箱服务器 yag yagmail.SMTP(user“hupo4210163.com”, password“EKFDBLAKHNHUZIMR”, host‘smtp.163.com’) 邮箱正文 contents [‘This is the body, and here is just text http://somedomain/image.png’, ‘You can find an audio file attac…...
2024/4/13 8:31:25 - 万人前题第二章
...
2024/4/28 5:27:05 - Python基础011:numpy总结
1、创建数组 In[2]: import numpy as np In[3]: a=np.array([1,2,3,4])...
2024/4/28 6:07:57 - 拓商:如何突出卖点提升销量
现如今,随着电商行业的迅速发展,做拼多多人也越来越多了,今天拓商就来给大家分享一下新手小白在发布产品的时候如何突出产品卖点,提升产品销量。 1.突出卖点 图片是影响该产品能否获得流量的最重要的因素之一,建议在主…...
2024/4/28 7:40:08 - “java.nio.file.NoSuchFileException: /tmp/undertow.xxx文件上报错
今天自测测试环境时发现上传文件失败 找了一下原因 SpringBoot项目直接启动时,会在操作系统的 /tmp 目录下生成一个包含undertow的临时目录,上传的文件先要转换成临时文件保存在这个文件夹下面。由于临时 /tmp 目录下的文件,在长时间不访问文…...
2024/4/13 8:31:40 - 前端进阶Ajax-----GET和POST请求
<script>// get请求var xhr new XMLHttpRequest();// 需要携带参数// 因为是GET请求,直接在地址后面进行参数的书写xhr.open(GET,"http://locahost:888/test/second?name小不言&age18",true);xhr.onload function(){console.log(JSON.parse(…...
2024/4/28 20:56:33 - A011 逻辑分析仪软件安装与使用
A011 逻辑分析仪软件安装与使用一、 软件下载二、 saleae逻辑分析仪安装 与基本使用三、 LA2016_KingstVIS_逻辑分析仪安装 与基本使用四、 注意事项一、 软件下载 LA2016_KingstVIS逻辑分析仪网盘链接 提取码:kqyn saleae逻辑分析仪网盘链接 提取码:7…...
2024/4/28 5:40:12 - 前端知识体系汇总梳理(更新ing)
1.es6 目录 1.es6...
2024/4/28 6:25:19 - 遥感影像识别-类别混淆问题
前情提要 紧接前文: 遥感影像识别-利用较大数据集训练 通过上次制作的数据集进行训练,最终得到拟合的深度学习模型,接下来分析出现的问题以及解决的想法。 1. 训练前的准备(补充) 由于前一篇文章并未指出数据集的使用方式导致数据集被误认…...
2024/4/28 11:24:08 - ___security_cookie机制,防止栈溢出
从研究底层和汇编以来,已经多次接触到“栈溢出”这个名词了。 这次在汇编码中看到了个不明就里的 ___security_cookie ,查了下,原来是编译器的安全检查机制。转载一篇文章: 首先,security cookie并不是windows系统自带…...
2024/4/8 18:19:00 - Exchange Rates(题目地址链接:https://acs.jxnu.edu.cn/problem/NOIOPJCH02062421)
描述: Now that the Loonie is hovering about par with the Greenback, you have decided to use your $1000 entrance scholarship to engage in currency speculation. So you gaze into a crystal ball which predicts the closing exchange rate between Canad…...
2024/4/19 3:43:40 - 基于Vite2编译Vue3项目does not provide an export named ‘default‘
基于Vite2编译Vue3项目,在开发时报错: Uncaught SyntaxError: The requested module /node_modules/jiaminghi/c-render/lib/index.js?v5a66da3e does not provide an export named default 错误原因是【bn.js】库使用【原生ES6的import】导出是,bs.js库不兼容【…...
2024/4/13 8:32:35 - 基于undo log版本链实现的ReadView机制
ReadView是什么? ReadView是“快照读”SQL执行时MVCC提取数据的依据,快照读就是最普通的Select查询语句,当你执行时,就会生成ReadView。 当前读指执行下列语句时进行数据读取的方式: Insert、Update、Delete、 Select…...
2024/4/18 15:17:54
最新文章
- Laravel 6 - 第十七章 配置数据库
文章目录 Laravel 6 - 第一章 简介 Laravel 6 - 第二章 项目搭建 Laravel 6 - 第三章 文件夹结构 Laravel 6 - 第四章 生命周期 Laravel 6 - 第五章 控制反转和依赖注入 Laravel 6 - 第六章 服务容器 Laravel 6 - 第七章 服务提供者 Laravel 6 - 第八章 门面 Laravel 6 - …...
2024/4/28 22:21:03 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 基于AI智能识别技术的智慧展览馆视频监管方案设计
一、建设背景 随着科技的不断进步和社会安全需求的日益增长,展览馆作为展示文化、艺术和科技成果的重要场所,其安全监控系统的智能化升级已成为当务之急。为此,旭帆科技(TSINGSEE青犀)基于视频智能分析技术推出了展览…...
2024/4/26 15:50:29 - Python语法总结:not(常出现错误)
0、not是什么 在python中not是逻辑判断词,用于布尔型True和False之前 a not Ture # a False b not False # b True1、not的用法 (1)判断语句 if not a:# 如果a是False,执行的语句(2)判断元素是否在…...
2024/4/26 2:51:31 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/28 13:52:11 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/28 3:28:32 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/26 23:05:52 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/28 13:51:37 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/28 1:28:33 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/28 15:57:13 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/28 1:34:08 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/28 1:22:35 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/25 18:39:14 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/26 23:04:58 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/27 23:24:42 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/28 5:48:52 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/26 19:46:12 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/27 11:43:08 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/27 8:32:30 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57