jsbridge原理_React Hooks 原理与最佳实践

1. 前言

React Hooks 是 React 16.8 引入的新特性,允许我们在不使用 Class 的前提下使用 state 和其他特性。React Hooks 要解决的问题是状态共享,是继 render-props 和 higher-order components 之后的第三种状态逻辑复用方案,不会产生 JSX 嵌套地狱问题。

2. 状态逻辑复用

一般来说,组件是 UI 和逻辑,但是逻辑这一层面却很难复用。对用户而言,组件就像一个黑盒,我们应该拿来即用。但当组件的样式或者结构不满足需求的时候,我们只能去重新实现这个组件。

08153fd845d781247c22b852f99bda7b.png

在我们开发 React 应用的时候,经常会遇到类似下面这种场景,你可能会有两个疑问:

  1. Loading 是否可以复用?
  2. Loading 该怎么复用?

    76aa8651ef34d1aefa2e0a2653497fc6.png

这几个例子都指向了同一个问题,那就是如何实现组件的逻辑复用?

2.1 render props

将函数作为 props 传给父组件,父组件中的状态共享,通过参数传给函数,实现渲染,这就是 render props。使用 render prop 的库有 React Router、Downshift 以及 Formik。以下面这个 Toggle 组件为例子,我们一般可以这样用:

ffe6889aae4d7aa3ccdf31d2cd25e85f.png

可以看到,控制 Modal 组件是否展示的状态被提取到了 Toggle 组件中,这个 Toggle 组件还可以拿来多次复用到其他组件里面。那么这个 Toggle 是怎么实现的呢?看到实现后你就会理解 render props 的原理

8ec188c90c74181f8548f45bbbbd610d.png

关于 render props 的更多内容可以参考 React 中文网的相关章节:Render Props

2.2 higher-order components

higher-order components 一般简称 hoc,中文翻译为高阶组件。从名字上就可以看出来,高阶组件肯定和高阶函数有什么千丝万缕的关系。高阶组件的本质是一个高阶函数,它接收一个组件,返回一个新的组件。在这个新的组件中的状态共享,通过 props 传给原来的组件。以刚刚那个 Toggle 组件为例子,高阶组件同样可以被多次复用,常常可以配合装饰器一起使用。

62f9ed2e2d099b59f77677764be8f2e8.png

高阶组件的实现和 render props 也不太一样,主要是一个高阶函数。

967c0b6c0d61fc6efb44c807ed2848ab.png

2.3 render props 和高阶组件的弊端

不管是 render props 还是高阶组件,他们要做的都是实现状态逻辑的复用,可这俩是完美的解决方案吗?考虑一下,如果我们依赖了多个需要复用的状态逻辑的时候,该怎么写呢?以 render props 为例:

a1b0972d6ae0ef6e39d131896469382c.png

看看这个代码,你有没有一种似曾相识的感觉?这一天,我们终于想起被“回调地狱”支配的恐惧。不得不再次祭出这张图了。

f473125ffa9ff1075a29a9fb3f62f17e.png

同样地,高阶组件也会有这个问题,但由于装饰器的简洁性,没有 render props 看起来那么可怕。除此之外,他们俩还有另一个问题,那就是组件嵌套过深之后,会给调试带来很大的麻烦。这个是 render props 中组件嵌套在 React 开发者工具中的表现。

2aa1d16ae3819c9783aba3606225fd4d.png

对于高阶组件来说,如果你没有对组件手动设置 name/displayName,就会遇到更严重的问题,那就是一个个匿名组件嵌套。毕竟上面 render props 的嵌套至少能知道组件名。

78adf347ab8642796849c91b25492c2d.png

社区里面也已经有很多解决 render props 嵌套的方案,其中 Epitath 提供了一种以 generator 的方法来解决嵌套问题,利用 generator 实现了伪同步代码。

f83b959b7cde8c93ed95a25abbf9fb1e.png

更多细节可以参考黄子毅的这篇文章:精读《Epitath 源码 - renderProps 新用法》

2.4 React Hooks

React Hooks 则可以完美解决上面的嵌套问题,它拥有下面这几个特性。

  1. 多个状态不会产生嵌套,写法还是平铺的

  2. 允许函数组件使用 state 和部分生命周期

  3. 更容易将组件的 UI 与状态分离

b5cf0d91b9ed7babfd080f90446a6d2f.png

上面是一个结合了 useState 和 useEffect 两个 hook 方法的例子,主要是在 resize 事件触发时获取到当前的 window.innerWidth。这个 useWindowWidth 方法可以拿来在多个地方使用。常用的 Hook 方法如下:

d3ecc6560878bc3023fdc5988bb9c05c.png

3. useState & useRef

useState 是 React Hooks 中很基本的一个 API,它的用法主要有这几种:

  1. useState 接收一个初始值,返回一个数组,数组里面分别是当前值和修改这个值的方法(类似 state 和 setState)。
  2. useState 接收一个函数,返回一个数组。
  3. setCount 可以接收新值,也可以接收一个返回新值的函数。
const [ count1, setCount1 ] = useState(0);const [ count2, setCount2 ] = useState(() => 0);setCount1(1); // 修改 state

3.1 和 class state 的区别

虽然函数组件也有了 state,但是 function state 和 class state 还是有一些差异:

  1. function state 的粒度更细,class state 过于无脑。
  2. function state 保存的是快照,class state 保存的是最新值。
  3. 引用类型的情况下,class state 不需要传入新的引用,而 function state 必须保证是个新的引用。

3.2 快照(闭包) vs 最新值(引用)

在开始前,先抛出这么一个问题。在 1s 内频繁点击10次按钮,下面代码的执行表现是什么?

32cfaadb8d90fbd92a4e306db998c541.png

如果是这段代码呢?它又会是什么表现?

f01d4f56cb2c2794cc64abf4a0333770.png

如果你能成功答对,那么恭喜你,你已经掌握了 useState 的用法。在第一个例子中,连续点击十次,页面上的数字会从0增长到10。而第二个例子中,连续点击十次,页面上的数字只会从0增长到1。

这个是为什么呢?其实这主要是引用和闭包的区别。

class 组件里面可以通过 this.state 引用到 count,所以每次 setTimeout 的时候都能通过引用拿到上一次的最新 count,所以点击多少次最后就加了多少。

在 function component 里面每次更新都是重新执行当前函数,也就是说 setTimeout 里面读取到的 count 是通过闭包获取的,而这个 count 实际上只是初始值,并不是上次执行完成后的最新值,所以最后只加了1次。

3.3 快照和引用的转换

如果我想让函数组件也是从0加到10,那么该怎么来解决呢?聪明的你一定会想到,如果模仿类组件里面的 this.state,我们用一个引用来保存 count 不就好了吗?没错,这样是可以解决,只是这个引用该怎么写呢?我在 state 里面设置一个对象好不好?就像下面这样:

const [state, setState] = useState({ count: 0 })

答案是不行,因为即使 state 是个对象,但每次更新的时候,要传一个新的引用进去,这样的引用依然是没有意义。

setState({    count: state.count + 1})

3.3 useRef

想要解决这个问题,那就涉及到另一个新的 Hook 方法 —— useRef。useRef 是一个对象,它拥有一个 current 属性,并且不管函数组件执行多少次,而 useRef 返回的对象永远都是原来那一个。

d491ea410f7735824c17f3e08eebc507.png

useRef 有下面这几个特点:

  1. useRef 是一个只能用于函数组件的方法。
  2. useRef 是除字符串 ref、函数 refcreateRef 之外的第四种获取 ref 的方法。
  3. useRef 在渲染周期内永远不会变,因此可以用来引用某些数据。
  4. 修改 ref.current 不会引发组件重新渲染。

useRef vs createRef:

  1. 两者都是获取 ref 的方式,都有一个 current 属性。
  2. useRef 只能用于函数组件,createRef 可以用在类组件中。
  3. useRef 在每次重新渲染后都保持不变,而 createRef 每次都会发生变化。

3.4 写需求遇到的坑

5c22207420d4186e75d26554608ec598.png

之前在写需求的时候遇到过这样的一个坑。bankIdref 都是从接口获取到的,这里很自然就想到在 useCallback 里面指定依赖。

8c6a13e81d6be0ad27e853d917d1b533.png

但是呢,这个 handlerReappear 方法需要在第一次进入页面的时候,向 JS Bridge 注册的事件,这就导致了一个问题,不管后来 handlerReappear 如何变化,registerHandler 里面依赖的 callback 都是第一次的,这也是闭包导致的问题。当然,你可能会说,我在 useEffect 里面也指定了依赖不好吗?但要注意这是个注册事件,意味着每次我都要清除上一次的事件,需要调用到 JS Bridge,在性能上肯定不是个好办法。

最终,我选择使用 useRef 来保存 bankIdref,这样就可以通过引用来获取到最新的值。

3e0aaf40b906cd239152270e19507e1e.png

3.5 Vue3 Composition API

54785e35f24f4eace287796207720a2c.png

在 vue3 里面提供了新的 Composition API,之前知乎有个问题是 React Hooks 是否可以改为用类似 Vue 3 Composition API 的方式实现?

然后我写了一篇文章,利用 Object.defineProperty 简单实现了 Composition API,可以参考:用 React Hooks 简单实现 Vue3 Composition API

当然这个实现还有很多问题,也比较简单,可以参考工业聚写的完整实现:react-use-setup

4. useEffect

useEffect 是一个 Effect Hook,常用于一些副作用的操作,在一定程度上可以充当 componentDidMountcomponentDidUpdatecomponentWillUnmount 这三个生命周期。useEffect 是非常重要的一个方法,可以说是 React Hooks 的灵魂,它用法主要有这么几种:

  1. useEffect 接收两个参数,分别是要执行的回调函数、依赖数组。
  2. 如果依赖数组为空数组,那么回调函数会在第一次渲染结束后(componentDidMount)执行,返回的函数会在组件卸载时(componentWillUnmount)执行。
  3. 如果不传依赖数组,那么回调函数会在每一次渲染结束后(componentDidMountcomponentDidUpdate)执行。
  4. 如果依赖数组不为空数组,那么回调函数会在依赖值每次更新渲染结束后(componentDidUpdate)执行,这个依赖值一般是 state 或者 props。

    a477d7474e04390846353f8c41a7592c.png

useEffect 比较重要,它主要有这几个作用:

  1. 代替部分生命周期,如 componentDidMount、componentDidUpdate、componentWillUnmount。
  2. 更加 reactive,类似 mobx 的 reaction 和 vue 的 watch。
  3. 从命令式变成声明式,不需要再关注应该在哪一步做某些操作,只需要关注依赖数据。
  4. 通过 useEffect 和 useState 可以编写一系列自定义的 Hook。

4.1 useEffect vs useLayoutEffect

useLayoutEffect 也是一个 Hook 方法,从名字上看和 useEffect 差不多,他俩用法也比较像。在90%的场景下我们都会用 useEffect,然而在某些场景下却不得不用 useLayoutEffect。useEffect 和 useLayoutEffect 的区别是:

  1. useEffect 不会 block 浏览器渲染,而 useLayoutEffect 会。
  2. useEffect 会在浏览器渲染结束后执行,useLayoutEffect 则是在 DOM 更新完成后,浏览器绘制之前执行。

这两句话该怎么来理解呢?我们以一个移动的方块为例子:

22ce859b9e950f2088694ccb0db82256.png

71c0c2637c5457306512c8754de507e8.gif

在 useEffect 里面会让这个方块往后移动 600px 距离,可以看到这个方块在移动过程中会闪一下。但如果换成了 useLayoutEffect 呢?会发现方块不会再闪动,而是直接出现在了 600px 的位置。

5a543f264c801601cb27fdef57a27f86.png

7a3abe366227fad59513d799d069646b.gif

原因是 useEffect 是在浏览器绘制之后执行的,所以方块一开始就在最左边,于是我们看到了方块移动的动画。然而 useLayoutEffect 是在绘制之前执行的,会阻塞页面的绘制,所以页面会在 useLayoutEffect 里面的代码执行结束后才去继续绘制,于是方块就直接出现在了右边。那么这里的代码是怎么实现的呢?以 preact 为例,useEffect 在 options.commit 阶段执行,而 useLayoutEffect 在 options.diffed 阶段执行。然而在实现 useEffect 的时候使用了 requestAnimationFramerequestAnimationFrame 可以控制 useEffect 里面的函数在浏览器重绘结束,下次绘制之前执行。

7f62d904e4136772df8402b17df53e9a.png

5. useMemo

useMemo 的用法类似 useEffect,常常用于缓存一些复杂计算的结果。useMemo 接收一个函数和依赖数组,当数组中依赖项变化的时候,这个函数就会执行,返回新的值。

const sum = useMemo(() => {    // 一系列计算}, [count])

举个例子会更加清楚 useMemo 的使用场景,我们就以下面这个 DatePicker 组件的计算为例:

73098579aeeb872e4ec0473d2e9a2241.png

DatePicker 组件每次打开或者切换月份的时候,都需要大量的计算来算出当前需要展示哪些日期。然后再将计算后的结果渲染到单元格里面,这里可以使用 useMemo 来缓存,只有当传入的日期变化时才去计算。

6. useCallback

和 useMemo 类似,只不过 useCallback 是用来缓存函数。

6.1 匿名函数导致不必要的渲染

在我们编写 React 组件的时候,经常会用到事件处理函数,很多人都会简单粗暴的传一个箭头函数。

class App extends Component {    render() {        return 

{}}>

}}

这种箭头函数有个问题,那就是在每一次组件重新渲染的时候都会生成一个重复的匿名箭头函数,导致传给组件的参数发生了变化,对性能造成一定的损耗。

在函数组件里面,同样会有这个传递新的匿名函数的问题。从下面这个例子来看,每次点击 div,就会引起 Counter 组件重新渲染。这次更新明显和 Input 组件无关,但每次重新渲染之后,都会创建新的 onChange 方法。这样相当于传给 Input 的 onChange 参数变化,即使 Input 内部做过 shadowEqual 也没有意义了,都会跟着重新渲染。原本只想更新 count 值的,可 Input 组件 却做了不必要的渲染。

4fdde2fe9938a37cd2d408591008c29a.png

这就是体现 useCallback 价值的地方了,我们可以用 useCallback 指定依赖项。在无关更新之后,通过 useCallback 取的还是上一次缓存起来的函数。因此,useCallback 常常配合 React.memo 来一起使用,用于进行性能优化。

bb59f15d3581c1a1d1aa383ba6428668.png

7. useReducer && useContext

7.1 useReducer

useReducer 和 useState 的用法很相似,甚至在 preact 中,两者实现都是一样的。useReducer 接收一个 reducer 函数和初始 state,返回了 state 和 dispatch 函数,常常用于管理一些复杂的状态,适合 action 比较多的场景。

0b4dc2eddfd8e913472de930d80b086e.png

7.2 useContext

在上一节讲解 React16 新特性的时候,我们讲过新版 Context API 的用法。

新版 Context 常常有一个提供数据的生产者(Provider),和一个消费数据的消费者(Consumer),我们需要通过 Consumer 来以 render props 的形式获取到数据。如果从祖先组件传来了多个 Provider,那最终就又陷入了 render props 嵌套地狱。

f65b1acd8e54ea4a7e6f3e70367e4566.png

useContext 允许我们以扁平化的形式获取到 Context 数据。即使有多个祖先组件使用多个 Context.Provider 传值,我们也可以扁平化获取到每一个 Context 数据。

597fef742c533a8b1c45e055f880172b.png

7.3 实现一个简单的 Redux

通过 useReducer 和 useContext,我们完全可以实现一个小型的 Redux。

reducer.js

5f803becf23799603a50325c2e185b05.png

Context.js

export const Context = createContext(null);

App.js

2979a07653daa451b808d1622cc0aa59.png

8. Custom Hooks

对于 react 来说,在函数组件中使用 state 固然有一些价值,但最有价值的还是可以编写通用 custom hooks 的能力。想像一下,一个单纯不依赖 UI 的业务逻辑 hook,我们开箱即用。不仅可以在不同的项目中复用,甚至还可以跨平台使用,react、react native、react vr 等等。编写自定义 hook 也需要以 use 开头,这样保证可以配合 eslint 插件使用。在 custom hooks 中也可以调用其他 hook,当前的 hook 也可以被其他 hook 或者组件调用。以官网上这个获取好友状态的自定义 Hook 为例:

8a00a1cb953f259354741ef13e34aa48.png

这个自定义 Hook 里面对好友的状态进行了监听,每次状态更新的时候都会去更新 isOnline,当组件卸载的时候会清除掉这个监听。这就是 React Hooks 最有用的地方,它允许我们编写自定义 Hook,然后这个自定义 Hook 可以复用给多个组件,并且不会和 UI 耦合到一起。

9. React Hooks 原理

由于 preact hooks 的代码和原有的逻辑耦合度很小,这里为了更加浅显易懂,我选用了 preact hooks 的源码来解读。

9.1 Hooks 执行流程

在 React 中,组件返回的 JSX 元素也会被转换为虚拟 DOM,就是下方的 vnode,每个 vnode 上面挂载了一个 _component 属性,这个属性指向了组件实例。而在组件实例上面又挂载了一个 _hooks 属性,这个 _hooks 属性里面保存了我们执行一个组件的时候,里面所有 Hook 方法相关的信息。

88abf2ad71eedab2fabe89163a4e6dc5.png

首先,我们有一个全局的 currentIndex 变量,当组件第一次渲染或者更新的时候,它会在每次进入一个函数组件的时候都重置为0,每次遇到一个 Hook 方法就会增加1,同时将这个 Hook 方法的信息放到 _list 里面。

当我们下次进来或者进入下一个组件的时候, currentIndex 又会被置为0。

组件渲染 => currentIndex 重置 0 => 遇到 Hooks 方法,放进 _list => currentIndex++ => 渲染结束

组件更新 => currentIndex 重置 0 => 遇到 Hooks 方法,获取 _list[currentIndex]=> currentIndex++ => 重复上面步骤 => 更新结束

这个时候就会从刚才的 _list 里面根据 currentIndex 来取出对应项,所以我们每次进来执行 useState,它依然能拿到上一次更新后的值,因为这里是缓存了起来。

62c0d247b28e65b6cbe48cc07353c4fd.png

通过上面的分析,你就不难发现,为什么 hooks 方法不能放在条件语句里面了。因为每次进入这个函数的时候,都是要和 currentIndex 一一匹配的,如果更新前后少了一个 Hook 方法,那么就完全对不上了,导致出现大问题。

9.2 useState 和 useReducer

这样你再来看下面 useState 和 useReducer 的源码就会更容易理解一些。

7561eab7b62acf799c97d823234ff408.png

很明显,getHookState 是根据 currentIndex 来从 _list 里面取和当前 Hook 相关的一些信息。如果是初始化状态(即没有 hookState._component)这个属性的时候,就会去初始化 useState 的两个返回值,否则就会直接返回上一次缓存的结果。

9.3 useEffect

useEffect 和 useState 差不多,区别就在 useEffect 接收的函数会放到一个 _pendingEffects 里面,而非 _list 里面。

c2f982a864e4def1396524776163c7c4.png

在 diff 结束之后会从 _pendingEffects 里面取出来函数一个个执行。afterPaint 里面使用了 requestAnimateFrame 这个方法,所以传给 useEffect 里面的方法是在浏览器绘制结束之后才会执行的。

032bd4a2691122f594e6d9dfb42e235a.png

9.4 总结

最后,这里对 React Hooks 的整个运行流程来进行一下总结和梳理。

  1. 每个组件实例上挂载一个 _hooks 属性,保证了组件之间不会影响。
  2. 每当遇到一个 hooks 方法,就将其 push 到 currentComponent._hooks._list 中,且 currentIndex 加一。
  3. 每次渲染进入一个组件的时候,都会从将 currentIndex 重置为 0 。遇到 hooks 方法时,currentIndex 重复第二步。这样可以把 currentIndex 和 currentComponent._hooks._list 中的对应项匹配起来,直接取上次缓存的值。
  4. 函数组件每次重新执行后,useState 中还能保持上一次的值,就是来自于步骤3中的缓存。
  5. 由于依赖了 currentComponent 实例,所以 hooks 不能用于普通函数中。

10. React Hooks 实践

得益于 react hooks 将业务逻辑从 ui 中抽离出来,目前社区里面关于 react hooks 的实践,大都是从功能点出发。

从最简单的 api 封装,例如 useDebounce、useThrottle、useImmerState 等等,再到业务层面功能封装,比较出名的库有 react-use、umijs/hooks 等等。

举个栗子:umijs/hooks 的表格:

7b791702dbd62c4db477d69731ebe1ad.png

在后台管理系统开发中,表格是非常常见的场景,将分页、查询、loading、排序等等功能打包封装成通用 Hook,就能发挥很大的潜力。

434cd3ef9ee0109fdce41a3e08979ac1.png

11. 推荐阅读

  1. Umi Hooks - 助力拥抱 React Hooks
  2. 为什么 React 现在要推行函数式组件,用 class 不好吗?
  3. useRequest- 蚂蚁中台标准请求 Hooks

最后

如果你觉得这篇内容对你挺有启发,我想邀请你帮我三个小忙:

  1. 点个「在看」,让更多的人也能看到这篇内容(喜欢不点在看,都是耍流氓 -_-)

  2. 欢迎加我微信「qianyu443033099」拉你进技术群,长期交流学习...

  3. 关注公众号「前端下午茶」,持续为你推送精选好文,也可以加我为好友,随时聊骚。

bf13c46e1b6deb112f9f78b39d505b14.png

8a86ef2299f98495b52dfa8089746f52.png点个在看支持我吧,转发就更好了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505917.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html小圆图堆叠轮播,每次移一张图片的无缝轮播图

my动画轮播图*{list-style: none;margin: 0px;padding: 0px;}.carousel{width: 530px;height: 280px;overflow: hidden;position: relative;}.carousel .imgList{width: 9999px;position: absolute;}.carousel .imgList>li{float: left;}.carousel .imgList>li>img{wi…

mfc绘制bezier b样条三种曲线_生存曲线(二):SPSS和Origin绘图教程及相关问题

上期生存分析推送后,有粉丝在后台问:有发生率的情况,为什么要做生存曲线分析?举个例子:临床试验中,共招募30位胃腺癌患者,均分为3组,分别使用了A/B/C三套不同的治疗方案,…

8位可控加减法电路设计_高级工程师:相同的地线GND,却有不同的电路设计含义...

问一个简单而又很难回答的电路问题:电路中的地线GND,它的本质是什么?工程师,在研发设计一个电路项目时,一般会经历三个阶段:电路项目PCBA板1,项目方案论证项目方案论证,是在项目前期…

word刷子刷格式_Excel技巧—开始菜单之格式刷六大功能

点赞再看,养成习惯千里之行,始于足下今天我们主要学习的是“第一区块-剪贴板”中的“格式刷”。“格式刷”主要将一个对象的颜色、字体样式、字体大小、边框样式等所有格式复制到目标对象上,我们可以把它理解为格式的复制粘贴。说到“格式刷”…

cwinthread*线程指针怎么销毁结束_最新版Web服务器项目详解 01 线程同步机制封装类...

点 击 关 注 上 方"两猿社"设 为"置 顶 或 星 标",干 货 第 一 时 间 送 达。互 联 网 猿 | 两 猿 社基础知识RAIIRAII全称是“Resource Acquisition is Initialization”,直译过来是“资源获取即初始化”.…

您的计算机无法访问dota2,解决win7系统DOTA2无法连接至Steam网络的设置方法

随着电脑的使用率越来越高,我们有时候可能会遇到win7系统DOTA2无法连接至Steam网络问题,如果我们遇到了win7系统DOTA2无法连接至Steam网络的问题,要怎么处理win7系统DOTA2无法连接至Steam网络呢?接下来给大家带来win7系统DOTA2无法…

根据经纬度计算范围_高中地理必修一二三思维导图+计算公式全汇总!能用3年...

必修一必修二必修三计算公式1.经纬度计算:经度差与地方时差算经度——地方时每相差1小时,经度相差1;纬差法与正午太阳高度算纬度——正午太阳相差多小,纬度相差多少;北极星的仰角即地平高度等于当地地理纬度;经纬线上长度算经纬度——1经线长…

linux 系统 可视化工具实时监控_Linux上的实时监控平台-你需要这样做

应朋友们要求,介绍上Linux系统下的实时监控平台,在上次提到了glances,它提供了较多的监控指标,那如果我们要看历史数据呢?某一时间段的回放呢?显然glances是做不到的。因此,实时监控平台就应运而…

linux 普通用户touch权限不够_Linux 开启指令

简单指令1.1、 ls 指令语法1:# ls [路径]表示列出指定路径下的文件夹和文件 的名字,如果路径没有指定则列出当前路径下的(list)列如:在root用户的家目录中输入ls命令,则会看到以下的效果:要求列…

5、this调用语句必须是构造函数中的第一个可执行语句_ES6中的Promise和Generator详解...

简介ES6中除了上篇文章讲过的语法新特性和一些新的API之外,还有两个非常重要的新特性就是Promise和Generator,今天我们将会详细讲解一下这两个新特性。Promise什么是PromisePromise 是异步编程的一种解决方案,比传统的解决方案“回调函数和事件”更合理和…

labelimg如何调整框的颜色_如何制作摄影集(下)

如果说上篇讲的是有关排版设计,那么下篇就是有关具体实施了。如果你正对作品集的制作跃跃欲试,那么下篇的内容仍旧非常重要,而且非常干货。 目录:软件推荐(Id)字体推荐纸张选择打印方式(激光、喷…

highcharts 显示平均值数值_拼多多评价多久能显示,有什么出评价技巧吗?

很多商家都知道,拼多多的评价,有时不一定会在买家评价后就立马出现,一般得等一段时间才会显示,,这个时间一般不会很久,24小时之内,评论一般在审核通过后就会展示出来。如果长时间不展示&#xf…

辽宁省大学生计算机系统与程序设计竞赛,2019CCF大学生计算机系统与程序设计竞赛(华东分赛区)在我校顺利举办...

5月18日,2019CCF大学生计算机系统与程序设计竞赛(CCSP)华东分赛区比赛及颁奖会在我校举办。今年是CCSP大赛首次采用区域分赛区的比赛,共分为7个赛区,包括东北区(哈尔滨工业大学承办),华北区(北京邮电大学承办)、华东区(南京航空航…

arm b bl 地址无关码_ARM汇编语言入门(六)

Part 6:条件状态和分支在探讨CPSR时我们已经接触了条件状态。我们通过跳转(分支)或者一些只有满足特定条件才执行的指令来控制程序在运行时的执行流。通过CPSR寄存器中的特定bit位来表示条件状态。这些位根据指令每次执行的结果而不断变化。例…

bcp out 带列名导出_从零开始学习 MySQL 系列索引、视图、导入和导出

阅读本文大概需要 8 分钟前言上篇文章我们学习了数据库和数据表操作语句,今天我们学习下数据库索引,视图,导入和导出的知识。作为基础篇,不会涉及到关于索引和视图的高级应用和核心概念,但是基本操作大家会了解&#x…

axure 输入框默认灰色字_Axure如何应对意外关闭

在使用Axure的时候,相信很多朋友都遇到过这样的情况:axure提交的东西都不见了。内容做到一半或者已经快要完成时,软件意外关闭,导致做的内容意外丢失。看着自己的劳动成果就这样浪费了,这种情况真的令人心疼。如果遇到…

matlaba绘制gps星空图_网络图横道图绘制软件 5.0免锁版告别纯手工绘制,修改工作量大!...

按图片加小编微信今日资料会员专属资料链接链接:https://pan.baidu.com/s/1AZY3cPeEv72GBRfESIwk_w提取码:88B8安装教程:1、下载压缩文件,解压后双击【网络计划V5.exe】,点击立即安装。2、没有替换补丁打开软件是这种情…

xp访问不了win10计算机,如何解决winxp访问win10共享打印机提示凭据不足

在win10的电脑上对着始按钮点鼠标右键,点击运行,或者直接“winR”输入gpedit.msc,点击确定,在本地策略组编辑器中依次点开——计算机配置——windows设置——安全设置——本地策略——安全选项,在右边的列表中找到“网…

centos7 关闭selinux_Devops之LDAP部署安装(centos7+openLDAP+PhpLDAPAdmin)

Devops之LDAP部署安装(centos7openLDAPPhpLDAPAdmin)由于公司部门的需求,需要搭建ldap来统一Devops的用户名和密码,具体的选择LDAP分析在上一篇里,这里主要记录一下部署centos7openLDAPPhpLDAPAdmin来实现Ldap服务,并使用phpldapa…

该计算机没有运行windows无线服务器,老司机示范win7系统诊断提示此计算机上没有运行的windows无线服务的恢复方法...

随着win7系统的普及,大家是否遇到过win7系统诊断提示此计算机上没有运行的windows无线服务的情况,近日就有朋友向我反映win7系统诊断提示此计算机上没有运行的windows无线服务的问题,那么我们应该如何处理win7系统诊断提示此计算机上没有运行…