Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。同时,它是100% 向后兼容的,不包含任何破坏性改动。

在我们讲解React Hook之前,先讲一下为什么要使用它,就好比谈对象,你得先搞清楚你喜欢他什么。我们知道,在没有 hook 之前,我们写一个 react 项目总是避免不了下面的代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

class Example extends React.Component {

  constructor(props) {

    super(props);

    this.state = {

      count: 0

    };

  }

 

  render() {

    return (

      <div>

        <p>You clicked {this.state.count} times</p>

        <button onClick={() => this.setState({ count: this.state.count + 1 })}>

          Click me

        </button>

      </div>

    );

  }

}

我想,对于很多做前端的朋友而言,如果学过后端语言还好,因为他们对类有一个明确的概念,对构造器和继承的理解也很容易,但对于很多直接就开始做前端的朋友(比如:非科班出生的一些自学者),突然让他们接受一个类的概念是很难适应的,虽然 ES6 已经有了 class。但是,如果你用 hook,就可以摆脱 class 了,上面的代码就变成了下面这样:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

import React, { useState } from 'react';

 

function Example() {

  // 声明一个叫 "count" 的 state 变量

  const [count, setCount] = useState(0);

 

  return (

    <div>

      <p>You clicked {count} times</p>

      <button onClick={() => setCount(count + 1)}>

        Click me

      </button>

    </div>

  );

}

少了extends,class,constuctor,super等关键字,是不是感觉一下子轻松了很多,同时,onClick 的代码也精简了很多。并且,对于前端来说,一个组件实现的是一个功能,用 function 来定义一个组件,比起用 class 来说,更符合语境。

当然,这只是其中的一个点,它的好处还有很多:

Hook 使你在无需修改组件结构的情况下复用状态逻辑,这使得在组件间或社区内共享 Hook 变得更便捷;

Hook 将组件中相互关联的部分拆分成更小的函数(比如设置订阅或请求数据),而并非强制按照生命周期划分。你还可以使用 reducer 来管理组件的内部状态,使其更加可预测。

Hook 使你在非 class 的情况下可以使用更多的 React 特性,让你的代码远离class。

废话到此结束,接下来,就分别讲讲各个 hook 的用法和作用。不过要记住一点,使用每个 hook 都得先从 react (16.8+版本) 中引入

1

import { useState } from 'react';

 

1、useState

上面的代码已经展示过它的功能了,useState 通过在函数组件里调用它来给组件添加一些内部 state,React 会在重复渲染时保留这个 state。useState 会返回一对值:当前状态和一个让你更新它的函数,你可以在事件处理函数中或其他一些地方调用这个函数。它类似 class 组件的 this.setState,但是它不会把新的 state 和旧的 state 进行合并。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

import React, { useState } from 'react';

 

function Example() {

  // 声明一个叫 "count" 的 state 变量

  const [count, setCount] = useState(0);

 

  return (

    <div>

      <p>You clicked {count} times</p>

      <button onClick={() => setCount(count + 1)}>

        Click me

      </button>

    </div>

  );

}

useState 支持我们在调用的时候直接传入一个值,来指定 state 的默认值,他支持可以作为js参数一切数据,包括函数,但如果是函数的话,函数必须要有返回值。

1

2

3

4

5

const [ obj,setObj ] = useState({ a: 1 }),

const [ arr,setArr ] = useState([ 1, 2 ]),

const [ count, setCount ] = useState(() => {

  return props.count || 0

})

我们在使用 useState 时,如果想要获取上一轮该 state 的值的话,只需要在 useState 返回的第二个参数,传入一个参数,该函数的参数就是上一轮的 state 的值。

1

2

3

setCount(count){

  return count + 1

}

当我们使用多个 useState 的时候,那 react 是如何识别哪个个是哪个呢?其实很简单,它是靠第一次执行的顺序来记录的,就相当于每个组件存放useState 的地方是一个数组,每使用一个新的 useState,就向数组中 push 一个 useState,所以,当我们在运行时改变 useState 的顺序,数据会混乱,增加 useState,程序会报错。

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

function App (props) {

  let count, setCount

  let sum, setSum

  if (count > 2) {

    [ count, setCount ] = useState(0)

    [ sum, setSum ] = useState(10)

  } else {

    [ sum, setSum ] = useState(10)

    [ count, setCount ] = useState(0)

  }

  return (

    <div>

      点击次数: { count }

      总计:{ sum }

      <button onClick={() => { setCount(count + 1); setSum(sum - 1)}}>点我</button>

    </div>

    )

}

 

2、useEffect

如果你熟悉 React Class 的生命周期函数,你可以把 useEffect 看做是 componentDidMount,componentDidUpdate 和 componentWillUnmount 这三个函数的组合,并且它会根据你传递的第二个参数达到灵活多变的效果。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

// 不使用useEffect

class App extends PureComponent {

  componentDidMount() {

    document.title = count

  }

  componentDidUpdate() {

    document.title = count

  }

}

// 使用useEffect

function App () {

  useEffect(() => {

    document.title = count

  })

}

 

useEffect 支持第二个参数,分三种情况:

1、什么都不传,组件每次 render 之后 useEffect 都会调用,相当于 componentDidMount 和 componentDidUpdate;

2、传入一个空数组 [], 只会调用一次,相当于 componentDidMount 和 componentWillUnmount;

3、’传入一个数组,其中包括变量,只有这些变量变动时,useEffect里的方法才会执行。

如果 useEffect 最后 return 了一个方法,return 的方法会在 componentWillUnmount 阶段执行,比如定时器的清除,就可以通过 return 一个 clearTimer 方法来搞定。

在实际开发中,适当的把逻辑拆分成多个 effect,不仅业务清晰,再配合好第二个参数,生命周期的问题就迎刃而解了。且看下面例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

function App () {

    const [ count, setCount ] = useState(0)

    const [ width, setWidth ] = useState(document.body.clientWidth)

 

    const onChange = () => {

      setWidth(document.body.clientWidth)

    }

    

    useEffect(() => {

      // 相当于 componentDidMount

      window.addEventListener('resize', onChange, false)

 

      return () => {

        // 相当于 componentWillUnmount

        window.removeEventListener('resize', onChange, false)

      }

    }, [])

 

    useEffect(() => {

      // 相当于 componentDidUpdate

      document.title = count

    })

 

    useEffect(() => {

      console.log(`count change: count is ${count}`)

    }, [ count ])

 

    return (

      <div>

        页面名称: { count }

        页面宽度: { width }

        <button onClick={() => { setCount(count + 1)}}>点我</button>

      </div>

      )

  }

3、useMemo

useMemo 主要用于一个变量依赖于另一个变量,有点类似于vue的计算属性,主要用于性能优化。同时它也支持传入第二个参数,用法和 useEffect 类似。不过需要注意的是,它的首次执行是在渲染的时候,而不是渲染完成之后。

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

function App(props) {

  const { pullUp, pullDown, onScroll } = props;

 

  // 对传入的上拉和下拉函数进行防抖处理

  let pullUpDebounce = useMemo(() => {

    return debounce(pullUp, 300)

  }, [pullUp]);

 

  let pullDownDebounce = useMemo(() => {

    return debounce(pullDown, 300)

  }, [pullDown]);

 

  // 绑定scrollEnd方法

  useEffect(() => {

    bScroll.on('scrollEnd', () => {

      //判断是否滑动到了底部

      if(bScroll.y <= bScroll.maxScrollY + 100){

        pullUpDebounce();

      }

    });

    return () => {

      bScroll.off('scrollEnd');

    }

  }, []);

 

  // 绑定touchEnd方法

  useEffect(() => {

    bScroll.on('touchEnd', (pos) => {

      //判断用户的下拉动作

      if(pos.y > 50) {

        pullDownDebounce();

      }

    });

    return () => {

      bScroll.off('touchEnd');

    }

  }, []);

}

 

4、useCallback

useCallback 可以说是 useMemo 的语法糖,能用 useCallback 实现的,都可以使用 useMemo,在 react 中我们经常面临一个子组件渲染优化的问题,尤其是在向子组件传递函数props时,每次 render 都会创建新函数,导致子组件不必要的渲染,浪费性能,这个时候,就是 useCallback 的用武之地了,useCallback 可以保证,无论 render 多少次,我们的函数都是同一个函数,减小不断创建的开销。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

// 例1

const onClick = useMemo(() => {

  return () => {

    console.log('button click')

  }

}, [])

 

const onClick = useCallback(() => {

console.log('button click')

}, [])

 

// 例2

const [count1, changeCount1] = useState(0);

const [count2, changeCount2] = useState(10);

 

const calculateCount = useCallback(() => {

  if (count1 && count2) {

    return count1 * count2;

  }

  return count1 + count2;

}, [count1, count2])

 

useEffect(() => {

  const result = calculateCount(count, count2);

  message.info(`执行副作用,最新值为${result}`);

}, [calculateCount])

 

useCallback 和直接使用 useEffect 不同的地方在于使用 useCallback 生成计算的回调后,在使用该回调的副作用中,第二个参数应该是生成的回调。其实这个问题是很好理解的,我们使用 useCallback 生成了一个与 count1 / count2 相关联的回调方法,那么当关联的状态发生变化时会重新生成新的回调,副作用监听到了回调的变化就会去重新执行副作用,此时 useCallback 和 useEffect 是按顺序执行的, 这样就实现了副作用逻辑的抽离。同样,useCallback 的第二个参数和 useMemo一样,没有区别。

5、useRef

useRef 总共有两种用法:

1、获取子组件的实例

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

const Children = forwardRef((props, ref) => {

  <div>

    <p>{props.title}</p>

  </div>

})

 

function App () {

  const [ count, setCount ] = useState(0)

  // 如果children组件不是一个forwardRef,这里会报错

  const childrenRef = useRef(null)

  // const

  const onClick = useMemo(() => {

    return () => {

      console.log('button click')

      console.log(childrenRef.current) // 这里可以得到Children实例

      setCount((count) => count + 1)

    }

  }, [])

  return (

    <div>

      点击次数: { count }

      <!-- ref得添加在一个forwardRef上才行 -->

      <Children ref={childrenRef}  count={count}></Children>

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

    </div>

    )

}


2、在函数组件中的一个全局变量,不会因为重复 render 而重复申明, 类似于类组件的 this.xxx。有些情况下,我们需要保证函数组件每次 render 之后,某些变量不会被重复申明,比如说 Dom 节点,定时器的 id 等等,在类组件中,我们完全可以通过给类添加一个自定义属性来保留,比如说 this.xxx, 但是函数组件没有 this,自然无法通过这种方法使用,有的朋友说,我可以使用 useState 来保留变量的值,但是 useState 会触发组件 render,在这里完全是不需要的,我们就需要使用 useRef 来实现了。

 

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

function App () {

  const [ count, setCount ] = useState(0)

  // 注意,这里的ref并没有指定给任何元素

  const timer = useRef(null)

  console.log(timer)

 

  let timer2

 

  useEffect(() => {

    let id = setInterval(() => {

      setCount(count => count + 1)

    }, 500)

 

    timer.current = id

    timer2 = id

    return () => {

      clearInterval(timer.current)

    }

  }, [])

 

  const onClickRef = useCallback(() => {

    clearInterval(timer.current)

  }, [])

 

  const onClick = useCallback(() => {

    clearInterval(timer2)

  }, [])

 

  return (

    <div>

      点击次数: { count }

      <button onClick={onClick}>普通</button>

      <button onClick={onClickRef}>useRef</button>

    </div>

  )

}

 

6、useImperativeHandle

useImperativeHandle 可以让你在使用 ref 时自定义暴露给父组件的实例值,说简单点就是,子组件可以选择性的暴露给父组件一些方法,这样可以隐藏一些私有方法和属性,官方建议,useImperativeHandle 应当与 forwardRef 一起使用。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

function Kun (props, ref) {

  const kun = useRef()

 

  const introduce = useCallback (() => {

    console.log('i can sing, jump, rap, play basketball')

  }, [])

  // 这里用useImperativeHandle暴露了一个方法出去

  useImperativeHandle(ref, () => ({

    introduce: () => {

      introduce()

    }

  }));

 

  return (

    <div ref={kun}> { props.count }</div>

  )

}

 

const KunKun = forwardRef(Kun)

 

function App () {

  const [ count, setCount ] = useState(0)

  const kunRef = useRef(null)

 

  const onClick = useCallback (() => {

    setCount(count => count + 1)

    // 这里使用暴露出来的方法,执行子组件的内部逻辑

    kunRef.current.introduce()

  }, [])

  return (

    <div>

      点击次数: { count }

      <KunKun ref={kunRef}  count={count}></KunKun>

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

    </div>

    )

}

 

7、useReducer

useReducer 有点类似 redux 中的功能,相较于 useState,它更适合一些逻辑较复杂且包含多个子值,或者下一个 state 依赖于之前的 state 等特定场景。

useReducer 总共有三个参数:

第一个参数是 一个 reducer,就是一个函数类似 (state, action) => newState 的函数,传入 上一个 state 和本次的 action;

第二个参数是初始 state,也就是默认值,是比较简单的方法;

第三个参数是惰性初始化,这么做可以将用于计算 state 的逻辑提取到 reducer 外部,这也为将来对重置 state 的 action 做处理提供了便利。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

function reducer(state, action) {

  switch (action.type) {

    case 'increment':

      return {count: state.count + 1};

    case 'decrement':

      return {count: state.count - 1};

    default:

      throw new Error();

  }

}

 

function App() {

  const [state, dispatch] = useReducer(reducer, {

    count: 0

  });

  return (

    <>

      点击次数: {state.count}

      <button onClick={() => dispatch({type: 'increment'})}>+</button>

      <button onClick={() => dispatch({type: 'decrement'})}>-</button>

    </>

  );

}

 

好了,讲了那么多,我们似乎知道了 Hook 究竟是怎么一回事,说白了,其实 Hook 就是返回包含了更多逻辑的 State 以及改变 State 的方法。

接下来我们来自定义一个自己的钩子,以计数器来为例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

import React, { useState } from 'react';

 

// 编写我们自己的hook,名字以use开头

function useCounter(initialValue) {

  // 接受初始化的值生成state

  const [count, changeCount] = useState(initialValue);

  // 声明减少的方法

  const decrease = () => {

    changeCount(count - 1);

  }

  // 声明增加的方法

  const increase = () => {

    changeCount(count + 1);

  }

  // 声明重置计数器方法

  const resetCounter = () => {

    changeCount(0);

  }

  // 将count数字与方法返回回去

  return [count, { decrease, increase, resetCounter }]

}

 

export default function myHooksView() {

  // 在函数组件中使用我们自己编写的hook生成一个计数器,并拿到所有操作方法的对象

  const [count, controlCount] = useCounter(10);

  return (

    <div>

      当前数量:{count}

      <button onClick={controlCount.decrease}>减少</button>

      <button onClick={controlCount.increase}>增加</button>

      <button onClick={controlCount.resetCounter}>重置</button>

    </div>

  )

}

 

本文主要参考文章:

https://www.cnblogs.com/ascoders/p/10591832.html、

https://blog.csdn.net/landl_ww/article/details/102158814

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

相关文章

  1. Machine Learning·instance analysis

    基本流程:问题建模=》获取数据=》特征工程=》模型训练与验证=》模型诊断与调优=》线上运行实例背景:Kaggle-泰坦尼克号问题问题建模:带有label的监督学习,算法:逻辑回归数据摸底获取数据:观察数据,数据能不能用,进行数据摸底结合人的先验知识,分析数据的Index获救的年龄…...

    2024/4/30 20:21:56
  2. operator study Hard.13

    package operator;public class Demo13 {public static void main(String[] args) {// 与(and) 或(or) 非(取反)boolean a = true;boolean b = false;System.out.println("a && b:"+(a&&b)); //逻辑与运算:两个变量值都为真,结果才为真Sys…...

    2024/4/30 23:31:29
  3. jdk8新特性-----Lambda表达式推导

    还会慢慢完善,先把大概的发出来 创建一个函数式接口 定义一个接口,编写实现类,在主方法调用实现类。 /*** 推导lambda表达式*/ public class TestLambda {public static void main(String[] args) {ILike like = new Like();like.lambda();} }//定义一个函数是接口 interfac…...

    2024/4/30 21:55:05
  4. 【学习笔记】零基础入门CV之街道字符识别-赛题理解

    1.简介 学习主题:零基础入门CV之街道字符识别。 学习目标:通过赛题引导竞赛选手入门计算机视觉,提高对数据建模。 2.赛事介绍 2.1 赛题目标 本次赛题的目标是识别出类似下图中的字符,例如下图中的数字“68”。图1 2.2 赛题数据 数据集来源于Google街景图像中的门牌号数据集…...

    2024/4/30 18:02:00
  5. Centos7下Hadoop之单机搭建

    Hadoop单机版环境搭建 centos7 hadoop 单机模式安装配置 官网AI+BigData+云计算其实大部分安装过程这边文章(Hadoop单机版环境搭建)已经说的很清楚了,只是简单的说几个需要注意的点:安装包注意不要下成 source 或者 binary ,直接到 Release Note 去下载 安装过程按照文章一步一…...

    2024/5/1 1:11:50
  6. label对齐,表单布局技巧

    想要文本对齐,但是不想用空格& nbsp;怎么办,给label一个合适的宽度就可以解决问题。给label一个合适的width .updataInfo label{width: 120px; }...

    2024/4/30 16:47:22
  7. ROS系统中订阅者和发布者之间的延迟很大

    为我的自动驾驶小车的坐标数据写了一个滤波算法。订阅原始的坐标数据topic_1,将坐标数据用算法滤波之后,以一个新的话题名topic_2发布。经过多次测试,滤波后的数据,延迟始终异常的大,在15s左右。起初以为是滤波算法复杂耗算力,但是打印出滤波算法的运行时间,运行时间很短…...

    2024/4/30 23:26:39
  8. 「面试题」20+Vue面试题整理

    0.那你能讲一讲MVVM吗? MVVM是Model-View-ViewModel缩写,也就是把MVC中的Controller演变成ViewModel。Model层代表数据模型,View代表UI组件,ViewModel是View和Model层的桥梁,数据会绑定到viewModel层并自动将数据渲染到页面中,视图变化的时候会通知viewModel层更新数据。…...

    2024/4/30 17:56:45
  9. 5.20币圈资讯持有超0.1枚BTC的地址数量与去年相比增加14%

    5.20币圈资讯持有超0.1枚BTC的地址数量与去年相比增加14% 韭菜币圈区块链 今天 5.20币圈资讯持有超0.1枚BTC的地址数量与去年相比增加14%USDT占比特币交易比重约为66.27%金色财经消息,据cryptocompare数据显示,目前比特币交易情况按照交易币种排名,排在第一的是USDT,占比为…...

    2024/4/23 15:12:52
  10. 统计学的Python实现-020:已知样本比例的抽样分布

    作者:长行 时间:2019.03.24统计学解释 已知样本比例的抽样分布计算是一种理想的抽样分布算法,通常用来学习抽样理论。其已知的信息为总体的分布特征,并求在抽取一定容量的样本后,样本的分布特征。 例如:已知1980年美国总统选举中,有3490万选民支持民主党,有4320万选民支…...

    2024/4/23 15:12:52
  11. 基于redisson实现注解版分布式锁

    文章目录配置自定义注解自定义切面实现使用 配置配置文件singleServerConfig:#连接空闲超时,单位:毫秒idleConnectionTimeout: 10000pingTimeout: 1000#连接超时,单位:毫秒connectTimeout: 10000#命令等待超时,单位:毫秒timeout: 3000#命令失败重试次数retryAttempts: 3#…...

    2024/4/23 15:12:57
  12. restful运行应变

    URI设计原则 1.动词+宾语 动词通常就是五种 HTTP 方法,对应 CRUD 操作。 GET:读取(Read) POST:新建(Create) PUT:更新(Update) PATCH:更新(Update),通常是部分更新 DELETE:删除(Delete) 根据 HTTP 规范,动词一律大写。 2.动词的覆盖 当客户端仅支持Post和Get…...

    2024/4/23 15:12:49
  13. Mac zsh+oh-my-zsh配置

    zsh+oh-my-zsh配置下载安装zsh解释器$ brew install zsh zsh-completions设置zsh为默认shell$ echo $(which zsh) >> /etc/shells $ chsh -s $(which zsh)查看当前shell$ echo $SHELL安装oh-my-zsh$ git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh…...

    2024/4/23 15:12:49
  14. nginx之ngx_hash

    nginx之ngx_hash nginx使用了开放地址法解决哈希冲突,还有利用内存对齐使用的一些小技巧等等。 下面是关于ngx_hash.h中的一些定义: /***先看nginx里面对hash每个元素的定义:*/ typedef struct {void *value;u_short len;u_char name[1]; }…...

    2024/4/23 15:12:48
  15. 【每日打卡】多数元素

    多数元素(简单) 2020年5月20日 题目来源:力扣解题 首先用比较熟悉的哈希表方法,记录个数还有出现次数最多的一个key值,最后输出这个key值。 这种方法时间复杂度和空间复杂度都为O(n)。 class Solution {public int majorityElement(int[] nums) {Map<Integer,Integer&g…...

    2024/4/23 15:12:53
  16. Unity UGUI Canvas的三种适配模式

    Canvas 的 Canvas Scaler 组件就是用来做适配的。 UI Scale Mode 设置为 Scale With Screen Size 时,可在下方设置一个默认尺寸。在 Editor上设计 UI 时就是根据这个默认尺寸进行布局。针对不同屏幕的分辨率,会根据 Screen Match Mode 中的适配模式,对默认尺寸进行缩放来实现…...

    2024/4/23 15:12:52
  17. 统计学的Python实现-011:偏度

    作者:长行 时间:2019.03.10偏度:偏度(skewness),也称偏态,是衡量统计数据分布偏斜方向和程度的统计量。例如,正态分布的偏度=0,即分布关于均值左右对称。 若偏度<0,则说明分布呈左偏态,此时均值左边的数据比右边少;若偏度>0,则说明分布呈右偏态,此时均值右…...

    2024/4/23 15:12:44
  18. python-列表推导式和if关联

    今天遇到的问题.需要在判断一个关键词里找出相应的关键字.我第一次用的方法: def func(str_1):abc = Noneif (xx or xx or "xxx") in str(str_1):abc = "xxxx_1"elif (xx or xx or "xxx") in str(str_1):abc = "xxxx_2"return abc发现…...

    2024/4/20 14:40:52
  19. CDH6.3.2 组件版本和Maven依赖版本

    目录remote repositorycomponent versiondependency templateartifact versionremote repository<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.…...

    2024/4/17 3:59:13
  20. Scala 求水仙花数的两种方法

    import scala.collection.mutable.ArrayBufferobject ShuiXianHua {/*** 水仙花数:153=1^3+5^3+3^3*整数=个位数*总位数 + 十位数*总位数 + 百位数*总位数*/def main(args: Array[String]): Unit = {//方法一for (x <- 100 to 999){//定义数组:累计各位数val arr =ArrayBu…...

    2024/4/20 17:06:31

最新文章

  1. C#逻辑运算符

    C#中逻辑运算符分为: 或、与、非 或||: 对两个bool值进行逻辑运算 有真则真 同假则假 与&&: 对两个布尔值进行运算 有假则假 同真为真 非&#xff01;: 对两个bool值进行取反 真变假 假变真 或 || 符号 &#xff1a; || <u>*对两个bool值进行逻辑运算 有真则…...

    2024/5/1 3:46:02
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. Idea集成Docker的快捷部署

    Idea集成Docker的快捷部署 配置Docker远程访问1.1 修改 `/lib/systemd/system/docker.service`1.2 替换`ExecStart`1.3 重启docker服务1.4 监听端口是否被占用1.5 服务器防火墙开启2375端口1.6 测试配置IDEA2.1 下载docker插件2.2 添加docker连接2.3 配置容器镜像加速器2.4 配置…...

    2024/4/30 20:48:45
  4. 第十二届蓝桥杯省赛真题(C/C++大学B组)

    目录 #A 空间 #B 卡片 #C 直线 #D 货物摆放 #E 路径 #F 时间显示 #G 砝码称重 #H 杨辉三角形 #I 双向排序 #J 括号序列 #A 空间 #include <bits/stdc.h> using namespace std;int main() {cout<<256 * 1024 * 1024 / 4<<endl;return 0; } #B 卡片…...

    2024/4/30 3:28:17
  5. 职场口才提升之道

    职场口才提升之道 在职场中&#xff0c;口才的重要性不言而喻。无论是与同事沟通协作&#xff0c;还是向上级汇报工作&#xff0c;亦或是与客户洽谈业务&#xff0c;都需要具备良好的口才能力。一个出色的职场人&#xff0c;除了拥有扎实的专业技能外&#xff0c;还应具备出色…...

    2024/5/1 2:36:04
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/29 23:16:47
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/30 18:21:48
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/30 9:43:22
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; 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
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在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