react-hooks 在不编写 class 的情况下使用 state 以及其他的 React 特性

2023-10-29

hooks

一、hook

1.useState()

​ 1). State Hook 让函数组件也可以有 state 状态,并进行状态数据的读写操作

​ 2). 语法 const [fruit, setFruit] = useState(123)

​ 3). useState() 说明:

​ 参数:第一次初始化指定的值在内部作缓存

​ 返回值:包含2个元素的数组(xxx, setxxx),第一个为内部当前状态值,第2个为更新状态值的函数

  	var ageState = useState(123); // 返回一个有两个元素的数组
  	var age = ageState[0]; // 数组里的第一个值
  	var setAge = ageState[1]; // 数组里的第二个值

​ 4). setState() 2中写法

​ setState(newValue):参数为非函数值,直接指定新的状态值,内部用其覆盖原来的状态值

​ setState(val => newVal):参数为函数,接收原来的状态值,返回新的状态值,内部用其覆盖原来的状态值

// 一个组件中可以声明多个 state 变量!
  const [xxx, setxxx] = useState(1);
  const [xxxx, setxxxx] = useState('222');
  const [xxxxx, setxxxxx] = useState([{name:'zhangning'}]);

2.useEffect()

​ 1). Effect Hook 可以让你在函数组件中执行副作用操作(用于模拟类组件中的声明周期钩子)

​ 默认情况下,它在第一次渲染之后每次更新之后都会执行

​ React 保证了每次运行 effect 的同时,DOM 都已经更新完毕。

​ 2). React 中的副作用操作:

​ 发 ajax 请求数据获取、设置订阅 / 启动定时器、手动更改真实 DOM

​ 3). effect 将在每轮渲染结束后执行,但你可以选择让它在只有某些之改变的时候才执行。

	useEffect(()=>{})
	useEffect(()=>{}, [])

	useEffect(()=>{}, [xxx])

	useEffect(()=>{
        // effect 可选的清楚机制(订阅或计时器ID等),为防止内存泄漏,清楚函数会在组件卸载前执行
        return ()=>{}
    }, [xxx])

3.useLayoutEffect()

​ 1.与useEffect相同,他会在所有的DOM变更之后同步调用effect

​ 2.可以使用它来读取DOM布局并同步触发重渲染。在浏览器绘制之前,useLayoutEffect内部的更新计划被同步刷新

4.自定义Hook

​ 1).自定义Hook是一个函数,必须以use开头,函数内部可以调用其他Hook

// 监听浏览器窗口大小
export function useWinSize() {
  const [size, setSize] = useState({
    width: document.documentElement.clientWidth,
    height: document.documentElement.clientHeight
  });

  const onResize = useCallback(() => {
    setSize({
      width: document.documentElement.clientWidth,
      height: document.documentElement.clientHeight
    });
  }, [size.width]);

  useEffect(() => {
    window.addEventListener('resize', onResize);
    // return 表示只有销毁的时候才执行
    return () => {
      window.removeEventListener('resize', onResize);
    };
  }, []);

  return size;
}
const width = useWinSize()

5.useRef()

​ 1).Ref Hook 可以在函数组件中存储、查找组件内的标签或任意其他数据

​ 2).语法:const refCont = useRef()

​ 3).作用:保存标签对象,功能与React.CreateRef()一样

import React, {useRef} from 'react';
import Children from './components/Children';

function Index() {
  const chRef = useRef();
  // 通过 current 访问子组件
  console.log(chRef.current)
  return (
    <>
      <Children ref={chRef}/>
    </>
  );
}
export default Index;

6.useImperativeHandle()

​ 1.可以在使用ref时自定义暴露给父组件的实例值。

useImperativeHandle(ref, createHandle, [deps])

​ 2.与forwardRef一起使用

// 父组件
function Parent() {
  const childRef = useRef();
  return (
    <div>
      <AllProjectTable ref={childRef}/>
      <button onClick={() => childRef.current.handleClick()}>aaaa</button>
    </div>
  );
}

// 子组件
const Child=(props, ref)=> {
    const [state, setState] = useSataeO();
  const handleClick = () => {};
  // 暴露给父组件的方法
  useImperativeHandle(ref, () => ({
    handleClick
  }));
  return (
    <>
      <button onClick={() => handleClick()}>dddd</button>
    </>
  );
}
// 子组件通过 forward 包裹起来
export default forwardRef(Child);

7.useContext()

​ 理解:一种组件间通信方式,常用于 祖组件 与 后代 组件间通信

​ 1.接收context对象并返回context的当前值,当前context值由上层组件中距离当前组件最近的<MyContext.Provider>的属性值prop决定

​ 2.即使祖先使用 React.memo 或shouldComponentUpdate,也会在组件本身使用 useContext时重新渲染。

​ 3.调用useContext的组件总会在context值变化时重新渲染

使用方式
1. 创建 Context 容器对象:
    const MyContext = React.createContext()
2.渲染子组件时,外面包裹 MyContext.Provider 通过 value 属性给后代组件传递数据
    <MyContext.Provider value={数据}>子组件</MyContext.Provider>
3.后代组件读取数据:
    // 第一种:仅适用于类组件,了解下就行
    const contextType = MyContext // 声明接收 context
    this.context // 读取 context 中的 value 数据
    // 第二种:函数组件、类组件都可以使用
    <MyContext.Consumer>
        {
            value => {// value 就是 context 中的 value 数据
                显示内容            
            }
        }
    </MyContext.Consumer>

​ 示例

import React, {createContext, useContext} from 'react';

// 创建 Context 容器对象
// 渲染子组件时,外面包裹 MyContext.Provider,通过 value 属性给后代组件传递数据
const MyContext = createContext({});
const {Provider, Consumer} = MyContext;

function AAA() {
  const name = 'zhangning';
  const age = 24;
  return (
    <div>
      我是祖组件,name:{name}
      <Provider value={{name, age}}>
        <BBB/>
      </Provider>
    </div>
  );
}
function BBB() {
  return <div><CCC/></div>;
}
function CCC() {
  // 这里也可以使用 useContext 直接获取数据,个人感觉更加方便实用
  // const {name} = useContext(MyContext);
  return <div>
    从祖组件获取的name:
    <Consumer>
      {value => {return `${value.name},年龄${value.age}`;}}
    </Consumer>
  </div>;
}

export default AAA;

8.useReducer()

​ 1.相当于useState的代替方案,接收一个(state, action)=>newState的reducer,并返回当前的state以及与其配套的dispatch方法。

​ 2.在某些场景下,useReducer会更加适用,例如 state 逻辑较复杂且包含多个子值,或者下一个 state 依赖于之前的 state 等。并且,使用useReducer还能给那些会触发深更新的组件做性能优化,可以向子组件传递dispatch而不是回调函数

const initialState = {count: 0};

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 Counter() {
  const [state, dispatch] = useReducer(reducer, initialState);
  return (
    <>
      Count: {state.count}
      <button onClick={() => dispatch({type: 'decrement'})}>-</button>
      <button onClick={() => dispatch({type: 'increment'})}>+</button>
    </>
  );
}

​ 官网并不推荐使用reducer来模拟Redux…

9.useMemo()

​ 1.返回一个memoized缓存值

​ 把创建函数和依赖项数组作为参数传入useMemo,只会在依赖项改变时才重新计算memoized缓存值。避免在每次渲染时都进行高开销的计算。

​ 传入useMemo的函数会在渲染期间执行。没有依赖项,每次渲染时都会计算新的值

​ 可以通过useMemo作为性能优化的方案。

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);

10.useCallback()

​ 1.把回调函数及依赖项数组作为参数传入,返回该回调函数的memoized缓存版本,该回调函数在依赖项改变时才会更新。

​ useCallback(fn, deps)相当于useMemo(()=>fu, deps)

​ 概念上说,所有回调函数中引用的值都应该出现在依赖项数组中。

const memoizedCallback = useCallback(
  () => {
    doSomething(a, b);
  },
  [a, b],
);

二、组件优化

1.component

​ 先了解一下在react中的class类组件中的性能优化方面,主要集中于一下两点

​ 1.调用setState时,就会触发组件重新渲染,无论前后state是否改变

​ 2.父组件更新,子组件也会自动更新(效率较低)

​ 提高效率的方法:

​ 让组件在 state 或 props 数据发生改变时 再进行 render()

​ 原因:只要调用了 setState 方法,组件中的 shouldComponentUpdate() 总是返回 true,导致组件 render

​ 解决方案

// 方案一:通过重写 shouldComponentUpdate()方法,比较新旧 state 或 props,有变化返回 true,没有变化返回 false
shouldComponentUpdate(nextProps, nextState) {
  console.log(this.props, this.state);// 当前 props 和 state
  console.log(nextProps, nextState);// 改变之后的 props 和 state
  if (JSON.stringify(nextProps) === JSON.stringify(this.props)
    || JSON.stringify(nextState) === JSON.stringify(this.state)) {
    return false;
  } else {
    return true;
  }
}
// 方案二: 使用 PureComponent 
// PureComponent 重写了 sholdComponentUpdate(),只有 state 或 props 数据有变化才返回 true
// 注意:只是进行 state 和 props 数据的浅比较,如果只是数据对象内部数据变了,返回 false、
// 不要直接修改 state 数据,而是要产生新数据
// 项目中一般使用 pureComponent 来优化
// pureComponent 缺点:可能会因深层的数据不一致而产生错误的否定判断,从而shouldComponentUpdate 的结果返回 false,界面得不到更新

2.hooks中优化性能方案

​ 在函数式组件中失去了 shouldComponentUpdate ,我发通过判断前后状态来决定是否更新。在函数式组件中,react 不再区分 mount 和 update 两个状态,也就是说函数组件的每一次调用都会执行其内部的所有略记,会带来较大的性能损耗。在此,hooks 中出现了两个钩子 useMemo 和 useCallback 来解决函数式组件的性能方案。

​ 先看下 useMemo 和 useCallback 的源码

function useCallback<T extends (...args: any[]) => any>(callback: T, deps: DependencyList): T;

function useMemo<T>(factory: () => T, deps: DependencyList | undefined): T;

​ 参数形式和 useEffect 一致,useEffect 作用是用于处理副作用,这两个则不行。

​ useMemo 和 useCallback 都会在组件第一次渲染的时候执行,之后会在依赖改变时再次执行;

​ 都返回缓存的值,useMemo 返回缓存的变量,useCallback 返回缓存的函数。

优点:useMemo包裹的变量,相当于对变量做了缓存,当父组件重新渲染时,变量不会改变==》子组件不会重新渲染

// useMemo 示例
function Test() {
  const [count, setCount] = useState(1);
  const [val, setVal] = useState('');

  // sum1 每次在 count 与 val 有一个改变的时候都会刷新组件重新执行 sum1。
  // 但是这里的计算 sum1 只依赖于 count 的值,在 val 修改的时候没有必要进行 sum1 的计算。
  // 这种情况下,我们就可以使用 useMemo,只在count 的值修改时执行计算(sum2)
  const sum1 = () => {
    console.log('sum1111');
    let sum = 0;
    for (let i = 0; i < count; i++) {
      sum += i;
    }
    return sum;
  };

  // 每次在 count 的值改变的时候才重新执行计算
  const sum2 = useMemo(() => {
    console.log('sum2222');
    let sum = 0;
    for (let i = 0; i < count; i++) {
      sum += i;
    }
    return sum;
  }, [count]);

  return (
    <div>
      <h1>{count}+++{val}+++{sum1()}+++{sum2()}</h1>
      <div>
        <button onClick={() => setCount(count + 1)}>+++</button>
        <input type='text' value={val} onChange={event => setVal(event.target.value)}/>
      </div>
    </div>
  );
}

useCallback

​ 为什么使用 useCallback,以及 useCallback 所能带来的性能提升

​ 和 useMemo 类似,当回调函数床底给经过优化的并使用引用相等性去避免非必要渲染的子组件时,他非常有用,和 pureComponent 的作用相同。就是说父组件传递一个函数给子组件的时候,由于父组件的更新会导致该函数重新生成从而传递给子组件的函数引用发生了变化,这就会导致子组件也会更新, 很多情况下子组件的更新并不是必要的,所以通过 useCallback 来缓存传递给子组件的函数。

优点:useCallback包裹的函数,相当于对函数做了缓存,当父组件重新渲染时,函数不会重新定义==》子组件不会重新渲染

const Child = ({getNum}) => {
  return <h1>数据:{getNum}</h1>;
};

function Test() {
  const [count, setCount] = useState(1);
  const [val, setVal] = useState('');

  const sum = useCallback(() => {
    return Array.from({length: count}, (v, i) => i).reduce((a, b) => a + b);
  }, [count]);

  return (
    <div>
      <Child getNum={sum}/>
      <h1>{count}+++{val}++++{sum()}</h1>
      <div>
        <button onClick={() => setCount(count + 1)}>+++</button>
        <input type='text' value={val} onChange={event => setVal(event.target.value)}/>
      </div>
    </div>
  );
}
// 以上只有当 count 改变的时候child组件才会重新渲染

总结:

memo用于包裹子组件

​ memo针对一个组件的渲染是否重复执行

	<Header />

​ usememo 针对一段函数逻辑是否重复执行

	()=>{}

​ useEffect 是在渲染之后完成的

​ useMemo是在渲染期间完成的(空数组只会执行一次)

	useMemo(()=>{},[])

​ useCallback

	useMemo(()=>{fn})等价于useCallback(fn)

3.Memo

​ memo() 和 PureComponent 相似,它帮助我们控制何时重新渲染组件

​ 理解就是,memo帮我们缓存组件,通过第二个参数的条件判断是否重新渲染

​ 示例:

​ 1.不适用memo,父组件更新,子组件也会更新

​ 2.父组件更新,子组件memo不适用第二个参数,默认对比 pre 和 next 里的每一项内容,父组件不传递任何属性给子组件,父组件更新属性,子组件不刷新

import React, {memo} from 'react';
import './index.scss';

const Header = memo(props => {
  return (
    <div>
      header 组件
    </div>
  );
});

export default Header;

​ 3.使用memo第二个参数,对比父组件传递给子组件的所有属性,有变化则更新

import React, {memo} from 'react';
import './index.scss';

const Header = memo(props => {
  return (
    <div>
      header 组件
    </div>
  );
}, (pre, next) => {
  const keys = Reflect.ownKeys(next);
  return keys.every(i => pre[i] === next[i]);
});

export default Header;

​ 4.使用memo第二个参数,对比某一个属性,对比父组件传递给子组件的所有属性,有变化则更新

import React, {memo} from 'react';
import './index.scss';

const Header = memo(props => {
  return (
    <div>
      header 组件
    </div>
  );
}, (pre, next) => {
  return pre.val === next.val;
});

export default Header;

三、

如何像组件内部动态传入带内容的结构(标签)?

​ Vue 中:使用 slot 技术,也就是通过组件标签体传入结构

​ React 中:

​ 使用 children props:通过组件标签体传入结构,下面的示例1

​ 使用 render props:通过组件标签属性传入结构,一般用 render 函数属性,下面示例 2

​ 使用children props

// children props 示例1
import React from 'react';

function AAA() {
  return (
    <><BBB>hello!</BBB></>
  );
}

function BBB(props) {
  return <>
    <h2>我是BBB组件</h2>
    {/*这里可以打印 AAA 父组件传递过来的 hello!,通过 props.children 接收*/}
    {props.children}
  </>;
}

export default AAA;

​ 使用render props

    // A 和 B 组件父子组件
    <A render={(data)=><B data={data}></B>}></A>
    A 组件:{this.props.render(内部 state 数据)}
    B 组件:读取 A 组件传入的数据显示 {this.props.data}
// 示例2
import React from 'react';

function AAA() {
  return (
    <>
      <BBB render={(name) => <CCC name={name}/>}></BBB>
      {/*<BBB peiqi={(name) => <CCC name={name}/>}></BBB>*/}
    </>
  );
}

function BBB(props) {
  const name = 'zhangning';
  return <>
    <h2>我是BBB组件</h2>
    {/*调用 render 方法,预留一个位子,放置组件,传递 name*/}
    {/*在 A 组件中,使用 B 组件,调用 render 方法,加载 B 组件的子组件 C,传递name,相当于 vue 中的插槽slot*/}
    {/*这里 render 可以写任意字符,在调用的时候保持一致就可,render 便于阅读*/}
    {/*{props.peiqi(name)}*/}{/*A 组件中使用的时候也要使用 peiqi*/}
    {props.render(name)}
  </>;
}

function CCC(props) {
  return <>
    <h2>我是BBB组件</h2>
    接收到B组件中的数据name:{props.name}
  </>;
}

export default AAA;

四、组件通信方式

​ 1.组件之间的关系

​ 1.父子组件

​ 2.兄弟组件(非嵌套组件)

​ 3.祖孙组件(跨级组件)

几种通信方式:
    1.props:
    	children props
    	render props
    2.消息订阅-发布
    	pubs-sub、event 等等
    3.集中式管理:
    	redux、dva
    4.context
    	生产者-消费者模式
比较好的搭配方式:
    父子组件:props
    兄弟组件:消息订阅-发布、集中式管理
    祖孙组件:消息订阅-发布、集中式管理、context(开发用的少,封装插件用的多)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

react-hooks 在不编写 class 的情况下使用 state 以及其他的 React 特性 的相关文章

  • 了解设置 JQuery 变量

    了解设置 JQuery 变量 最近 我通过在 StackOverflow 上遇到的另一个问题寻找帮助 了解到如何设置 JQuery 变量 如下所示 您可以通过简单地调用变量来创建输入字段 并且锚变量似乎也定义了样式 var clicked
  • 从数据 URI 解码 QR 码

    我尝试从数据 uri 中解码二维码 var dataUri data image gif base64 R0lGODdh9gD2AIAAAAAAAP ywAAAAA9gD2AAAC decodeQrCode dataUri cb 我已经尝试
  • jquery.find() 可以只选择直接子项吗?

    我应该向 jQuery find 提供什么参数来选择元素子元素而不选择其他元素 我不能用 gt 引导选择器 而用 将选择所有后代 而不仅仅是直接子代 我知道 jQuery children 但这是一个库 因此用户能够提供自己的选择器 并且我
  • TypeError: props.render 不是一个函数(React hook 形式)

    我将方法作为我用react hook form制作的形式的道具传递 当从react hook form添加控制器时 它给了我 TypeError props render不是一个函数 我在网上找不到任何解决方案 因此感谢任何帮助 impor
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 使用 Angular 下载具有动态 src 的脚本

    Angular 提供了通过动态名称动态加载模板的方法ng include 该部分中的内联 JS 和 CSS 可以正常加载 但没有一个好的方法来下载带有动态 url 的脚本 我们需要下载脚本 相对于调用它们的 html 部分的路径 即我们有一
  • 标签获取 href 值

    我有以下 html div class threeimages a img alt Australia src Images Services 20button tcm7 9688 gif a div class text h2 a hre
  • React - 无法读取未定义的属性[重复]

    这个问题在这里已经有答案了 通常 当我单击子组件中的菜单项时 它会调用 this handlesort 这是一个本地函数 处理排序从我的父组件中获取 onReorder 属性 onReorder 调用名为 reOrder 的本地函数 它设置
  • Meteor - 从客户端取消服务器方法

    我正在通过服务器方法执行数据库计数 用户可以选择他们希望如何执行计数 然后调用该方法 我的问题是 计数可能需要一些时间 并且用户可能会在方法运行时改变主意并请求不同的计数 有什么方法可以取消调用的方法并运行新的计数吗 我认为 this un
  • 如何使输入字段和提交按钮变灰

    我想变灰这两件事 http doorsplit heroku com 歌曲输入字段和提交按钮 直到用户输入艺术家 有没有一种简单的方法可以通过 JQuery 来做到这一点 艺术家输入字段的id是 request artist 你可以这样做
  • 提交表单并重定向页面

    我在 SO 上看到了很多与此相关的其他问题 但没有一个对我有用 我正在尝试提交POST表单 然后将用户重定向到另一个页面 但我无法同时实现这两种情况 我可以获取重定向或帖子 但不能同时获取两者 这是我现在所拥有的
  • Electron - 为什么在关闭事件时将 BrowserWindow 实例设置为 null

    The 电子文档 https electronjs org docs api browser window 提供以下代码示例来创建新窗口 const BrowserWindow require electron let win new Br
  • Laravel 中只向登录用户显示按钮

    如果我以 John 身份登录 如何才能只显示 John 的红色按钮而不显示 Susan 的红色按钮 测试系统环境 Win10 Laravel5 4 Mysql5 7 19 table class table table responsive
  • 在 React 中实现 Google 登录错误 -

    我正在尝试在 React 中实现 google 登录 这是我的组件 import Fragment useEffect from react import GOOGLE CLIENT ID from some file const Goog
  • 如何在类似控制台的环境中运行 JavaScript?

    我正在尝试遵循这里的示例 http eloquentjavascript net chapter2 html http eloquentjavascript net chapter2 html and print blah 在浏览器中运行时
  • 为什么我不能在 AngularJS 中使用 data-* 作为指令的属性名称?

    On the t他的笨蛋 http plnkr co edit l3KoY3 p preview您可以注意到属性名称模式的奇怪行为data 在指令中 电话 Test of data named attribute br
  • 在 vue.js 中访问数组对象属性

    给定以下数组vue js packageMaps Object packageMap 0 Object Id 16 PackageType flag list ProductCode F BannerBase packageMap 1 Ob
  • Javascript转换时区问题

    我在转换当前时区的日期时间时遇到问题 我从服务器收到此日期字符串 格式为 2015 10 09T08 00 00 这是中部时间 但是当我使用 GMT 5 中的 new Date strDate 转换此日期时间时 它返回给我的信息如下 这是不
  • 如何在 pg-promise 中设置模式

    我正在搜索的文档pg 承诺 https github com vitaly t pg promise特别是在创建客户端时 但我无法找到设置连接中使用的默认架构的选项 它始终使用public架构 我该如何设置 通常 为数据库或角色设置默认架构
  • 如何在 Swiper 实例之外使用 useSwiper?

    我在用着用于 React 的滑动器 https swiperjs com react显示一些幻灯片 我一直坚持使用外部按钮在幻灯片 上一张和下一张 之间导航 刷卡器有一个useSwiper hook https swiperjs com r

随机推荐

  • 释放内存总结

    1 用new malloc显式分配在堆上的内存才需要用delete free释放 而在栈上分配的如int array 80 在子程序结束时自动释放 分配与释放都和数据类型无关 2 delete一个指针的时候 一定要检查是否为null 否则是
  • 从键盘输入10个整数,并从中找出最大数 (C语言)

    代码 include
  • imagej得到灰度图数据_ImageJ实用技巧——电镜图像上色(基本功能篇)

    扫描电镜和透射电镜图像上色 通常是用Photoshop来完成的 其实只要懂得原理 ImageJ也能完成这一操作 不需要额外下载和学习PS 这篇文章也是对ROI Manager Image Calculator功能的补充 以2019 nCoV
  • qt中树形控件QTreeWidget的项点击后获取该项的文本

    概述 通过点击树形控件的项 可以得到被点击的树形控件的文本 使用树形控件的信号itemPressed与所在类的槽函数绑定 通过传递参数QTreeWidgetItem和列column 在绑定的槽函数中得到被点击的项的文本 下面上代码 conn
  • 【yarn】yarn 分布式缓存、日志目录

    1 概述 HDFS依赖缓存到节点本地磁盘 以便直接本地读取 NM第一次启动容器任务会从HDFS同步依赖 并缓存到本地 如果NM不是第一次启动该应用 则从本地缓存读依赖文件 2 缓存置换算法 由于磁盘有限 NM采用缓存置换算法定期清理文件 3
  • Elasticsearch安装,Springboot整合Elasticsearch详细教程

    Elasticsearch 是一个分布式 RESTful 风格的搜索和数据分析引擎 能够实现近乎实时的搜索 Elasticsearch官网https www elastic co cn 这篇文章主要简单介绍一下Elasticsearch E
  • 用深度神经网络修复H漫:看完这篇你就能眼中无码

    晓查 发自 凹非寺量子位 出品 公众号 QbitAI AI 脑补 能力一流 现在甚至已经能画出艺术品 热爱H漫的死宅们灵光一闪 AI是否也可以把马赛克阻挡的内容也画出来呢 果然 原始动物本能是第一科技生产力 最近就有人在GitHub上发布了
  • 【C++奇遇记】内存模型

    博客主页 博主链接 本文由 M malloc 原创 首发于 CSDN 学习专栏推荐 LeetCode刷题集 数据库专栏 初阶数据结构 欢迎点赞 收藏 留言 如有错误敬请指正 未来很长 值得我们全力奔赴更美好的生活 文章目录 本章详情 内存模
  • 这些各行各业优秀的ppt模板推荐给大家

    大家学PPT第一反应肯定是未来掌握演讲的辅助工具 以及汇报工作的辅助工具 其实PPT还有很多其他的用途 可以帮助我们在生活和工作中拔得头筹 也可以给我们增添更多趣味 PPT并不能直接带来经济效益 但一个优秀的PPT能使观看者对你的能力 你的
  • 到底还有没有月薪3万以下的程序员?程序员工资真的这么高?

    最近被 月薪5万过得像5千 的 西二旗生活指北 刷屏 文章直指 海淀西北角的群众们不仅能把月入5万活得像5千 他们还能把月入10万 20万 50万也活得像月入5千 我关注的点不在于 活得像月入5千 这对我来说一点难度都没有 我能活得像月入5
  • 万向节死锁产生的原因

    万向节死锁产生的根本原因是 旋转矩阵是依次进行的 假设先围绕x轴旋转 再围绕y轴旋转 最后围绕z轴旋转 这就导致物体其实是围绕自己的X轴旋转 而不是世界坐标的X轴旋转 表现就是 在一个欧拉角 x y z 下 改变x的值 物体会围绕物体自己的
  • Kendo UI开发教程(11): Kendo MVVM (二) ObservableObject 对象

    概述 Kendo MVVM框架关键的一个部分为ViewModel 它主要是通过kendo data ObserableObject来提供支持的 它可以监控改变 UI变化或是值的变化 并通知关心该变化的组件 本篇以下ViewModel 和 O
  • sqli-labs靶场第一关

    开始第一关之前 我们先在火狐上下载一个插件hackbar 点火狐右上角的菜单 找到扩展和主题 在扩展中搜索hackbar 点击下载第一个hackbar插件 下载完成之后 我们开始sql靶场第一关的解析过程 下载hackbar主要是为了后续操
  • H.264 视频的 RTP 载荷格式

    本文是 IETF 的规范 RFC 6184 的一部分的翻译 该规范 地址 翻译这份文档 主要是为了编写一段用 RTP 传输 H 264 流的代码 本想在网上找一些文章完成任务了事的 但由于个人之前音视频编解码相关的知识比较匮乏 网上找的文章
  • 防网关病毒的知识

    1 什么是恶意软件 恶意软件官方的一个定义 恶意软件 Malware 从 恶意 malicious 和 软件 software 这两个词合并而来 是一个通用术语 可以指代病毒 蠕虫 特洛伊木马 勒索软件 间谍软件 广告软件和其他类型的有害软
  • 怎么引css样式,jsp怎么引入css样式?

    JSP页面引入CSS样式有三种方法 且其优先级不同 具体如下 外部样式 内嵌样式 行内样式 优先级依次增高 下面给大家具体介绍一下 1 外部样式 jsp可以在link标签中使用href属性引入css文件路径 首先把写好的css样式表内容存为
  • Linux里的2>&1究竟是什么

    我们在Linux下经常会碰到nohup command gt dev null 2 gt 1 这样形式的命令 首先我们把这条命令大概分解下首先就是一个nohup表示当前用户和系统的回话下的进城忽略响应HUP消息 是把该命令以后台的job的形
  • 德勤与Attest合作,开发政府级区块链身份管理系统

    11月5日报道 四大会计师事务所之一的德勤 Deloitte 与身份管理公司Attest合作 开发了基于区块链的政府级数字身份系统 区块链开发 位于芝加哥的身份管理公司Attest提供了一个共享的身份平台 客户可以在这里进行交易 政府客户可
  • QT 线程常见需要注意的问题

    C C 程序都是从main 函数开始执行的 main 函数其实就是主进程的入口 main 函数退出了 则主进程退出 整个进程也就结束了 而对于使用Qthread创建的进程而言 run 函数则是新线程的入口 run 函数退出 意味着线程的终止
  • react-hooks 在不编写 class 的情况下使用 state 以及其他的 React 特性

    文章目录 hooks 一 hook 1 useState 2 useEffect 3 useLayoutEffect 4 自定义Hook 5 useRef 6 useImperativeHandle 7 useContext 8 useRe