React基础知识大汇总

函数组件和类组件

函数组件与类组件有什么区别呢?

function getName(params:{name:string}){
	const count = 0;
	return params.name +'-'+count;
}
getName({name:"test"})
getName({name:"哈哈哈"})

getName是一个纯函数,不产生任何副作用,执行结束后,它的执行上下文和活动对象会被销毁,前后两次调用互不影响。对于不使用任何Hooks的函数组件而言,它也是纯函数,那么对于函数组件前后两次渲染,你能得出与调用getName函数类似的结论吗?

下面用类组件和函数组件实现相同的功能来对比二者的区别。在浏览器上显示一个按钮,单击按钮调用props中的方法来更新父组件的状态,隔1s之后打印this.props.count的值。类组件的代码如下:

import { Button } from 'antd'
import React, { Component } from 'react'

class ClassCom extends Component {

    onClick = () => {
        this.props.updateCount()
        setTimeout(() => {
            console.log("类组件",this.props.count)
        }, 1000)
    }

    render() {
        return (
            <Button onClick={this.onClick}>
                这是类组件
            </Button>
        )
    }
}

function FunCom(props) {

    const onClick = () => {
        props.updateCount()
        setTimeout(() => {
            console.log("函数组件",props.count)
        }, 1000)
    }

    return (
        <Button onClick={onClick}>
            这是函数组件
        </Button>
    )
}

export default class FunComVsClassCom extends Component {

    constructor(props) {
        super(props)
        this.state = {
            count: 0
        }
    }

    updateCount = () => {
        this.setState({
            count:this.state.count+1
        })
    }

    render() {
        return (
            <div>
                <FunCom
                    count={this.state.count}
                    updateCount={this.updateCount}
                />
                <ClassCom
                    count={this.state.count}
                    updateCount={this.updateCount}
                />
            </div>
        )
    }
}

在这里插入图片描述
单击FuncCom和ClassCom组件中的按钮都会使得父级重新刷新,从而导致FuncCom和ClassCom重新渲染。ClassCom是类组件,重新渲染不会创建新的组件实例,在setTimeout的回调函数中this.props拿到了最新的值。FuncCom是函数组件,重新渲染会创建新的执行环境和活动变量,所以访问props,无论何时拿到的都是调用FunCom时传递给它的参数,该参数不可变。

React Ref API

Ref的功能强大,它能够让组件与DOM元素,或类组件与其父级之间建立直接联系。总体而言,使用Ref出于以下3个目的。

  • 访问DOM元素。
  • 访问组件的实例。
  • 将Ref作为mutable数据的存储中心
  1. 创建Ref
    创建Ref有两种方式,分别为useRef和React.createRef。useRef是一种Hooks,只能在函数组件中使用。React.createRef的使用位置不限制,但不要在函数组件中使用它,如果在函数组件中使用它创建Ref,那么函数组件每次重新渲染都会创建新的Ref。

  2. 访问DOM元素或组件实例
    要想通过Ref访问DOM元素,必须将Ref绑定到浏览器内置的组件上。等组件装载了之后使用ref.current字段访问DOM元素。

    export default function App() {
    const inputRef = useRef(null)
    const onClick=()=>{
      if(inputRef.current){
        inputRef.current.focus()
      }
    }
     return (
        <input ref={inputRef}/>
      )
    }
    
  3. 将Ref作为mutable数据的存储中心
    将Ref作为mutable数据的存储中心,使用场景主要是函数组件,在类组件中大可不必如此。这是因为函数组件每一次重新渲染都会执行函数体,使函数体的各个变量都被重新创建。如果函数体中声明了一些只用于缓存的数据,即不会导致组件重新渲染的变量,那么将这些数据放在ref中能避免它们被反复创建。
    将Ref作为mutbale数据的存储中心,不需要将其绑定到React element上,创建之后就能直接使用,修改mutableRef.current的值,组件不会重新刷新。

React Hooks

React Hooks在React16.8时正式发布。它使函数组件拥有自己的状态。对类组件没有影响。一般函数组件相比起类组件存在如下3个优点:

  • 类组件必须时刻关注this关键字的指向。
  • 相同的生命周期在类组件中最多定义一个,这导致彼此无关的逻辑代码被糅杂在同一个函数中。
  • 不同的生命周期函数可能包含相同的代码。最常见的便是componentDidMount和componentDidUpdate。
useState

useState是一个与状态管理相关的Hooks,能让函数组件拥有状态,是最常用的Hooks之一,useState的基本用法。

  1. useState的参数不是函数
    此时,useState的参数将作为状态的初始值,如果没有传参数,那么状态的初始值为undefined。

    const [name,setName] = useState("test")
    const [age,setAge] = useState()
    
  2. useState的参数是函数
    此时,函数的返回值是状态的初始值。某些时候,状态的初始值要经过计算才能得到。此时推荐将函数作为useState的参数,该函数只在组件初始渲染时执行一次。

    const [count,setCount] = useState(()=>{
        //这个函数只在初始渲染时执行,后续的重新渲染不再执行
        return 0
    })
    
  3. 修改状态的值
    修改状态有两种方式:

    //用法一
    setCount((count)=>{
      return count+1
    })
    //用法二
    setCount(0)
    

如果setCount的参数时函数,那么count现在的值将以参数的形式传递给函数,函数的返回值用于更新状态。如果setCount的参数不是函数,那么该参数将用于更新状态。状态值发生变化将导致组件重新渲染,重新渲染时,useState返回的第一个值始终是状态最新的值,不会重置为初始值。

useRef

使用useState能让函数组将拥有状态,状态拥有不变性,它在组件前后两次渲染中相互独立。使用useRef能为组件创建一个可变的数据,该数据在组件的所有渲染中保持唯一的引用,所以对它取值始终会得到最新的值。

useEffect

函数组件可以多次调用useEffect,每使用一次就定义一个effect,这些effect的执行顺序与它们被定义的顺序一致,建议将不同职责的代码放在不同的effect中。接下来从effect的清理工作和依赖这两个方面介绍useEffect。

  1. effect的清理工作
    effect没有清理工作就意味着它没有返回值。effect的清理工作由effect返回的函数完成,该函数在组件重新渲染后和组件卸载时调用。

    useEffect(()=>{
       document.body.addEventListener('click',()=>{})
        //在返回的函数中定义与该effect相关的清理工作
        return()=>{
            document.body.removeEventListener('click',()=>{})
        } 
    })
    

    该effect在组件首次渲染和之后的每次重新渲染时都会执行,如果组件的状态更新频繁,那么组件重新渲染也会很频繁,这将导致body频繁绑定click事件又解绑click事件/是否有办法使组件只在首次渲染时给body绑定事件呢?那就是依赖。

  2. effect的依赖
    前面示例定义的effect没有指明依赖,因此组件的每一轮渲染都会执行它们。

    useEffect(()=>{
       document.body.addEventListener('click',()=>{})
        //在返回的函数中定义与该effect相关的清理工作
        return()=>{
            document.body.removeEventListener('click',()=>{})
        } 
    },[])//传空意味着该effect只在组件初始渲染时执行,它的清理工作在组件卸载时执行。
    
    useEffect(()=>{
       document.body.addEventListener('click',()=>{})
        //在返回的函数中定义与该effect相关的清理工作
        return()=>{
            document.body.removeEventListener('click',()=>{})
        } 
    },[name])//在组件初始渲染时会执行,当name发生变化导致组件重新渲染也会执行,相应的,组件卸载时和由name变化导致组件重新渲染之后将清理上一个effect
    

    注意:给effect传递依赖项,React会将本次渲染时依赖项的值与上一次渲染时依赖项的值进行浅对比,如果它们当中的一个有变化,那么该effect会被执行,否则不会执行。为了让effect拿到他所需状态和props的最新值,effect中所有要访问的外部变量都应该作为依赖项。函数组件每次渲染时,effect都是一个不同的函数,在函数组件内的每一个位置(包括事件处理函数、effects、定时器等)只能拿到定义他们的那次渲染的状态和props。

useReducer

useReducer是除useState之外另一个与状态管理相关的Hooks。这个Hooks笔者用得比较少,需要的同学可以参考下官方文档。
https://zh-hans.react.dev/reference/react/useReducer

用法如下:

import { useReducer } from 'react';

function reducer(state, action) {
  if (action.type === 'incremented_age') {
    return {
      age: state.age + 1
    };
  }
  throw Error('Unknown action.');
}

export default function Counter() {
  const [state, dispatch] = useReducer(reducer, { age: 42 });

  return (
    <>
      <button onClick={() => {
        dispatch({ type: 'incremented_age' })
      }}>
        Increment age
      </button>
      <p>Hello! You are {state.age}.</p>
    </>
  );
}

自定义Hooks

如果在多个组件中使用了相同的useEffect或useState逻辑,推荐将这些相同的逻辑封装到函数中,这些函数被称为自定义的Hooks。下面举例3个自定义的Hooks的示例。

  1. useForceUpdate:返回一个让组件重新渲染的函数。

     function useForceUpdate(){
        const [,setTick]=useState(0)
        return ()=>setTick(t=>t+1)
     }
     const forceUpdate = useForceUpdate();
      const handleClick = () => {
           // 调用 forceUpdate 函数来强制组件重新渲染
          forceUpdate();
     };
    
    
  2. usePrevVal:获取状态的上一次的值,它利用了Ref的可变性,以及effect在DOM被绘制到屏幕上才执行的特性

    function usePrevVal(status){
       const ref = useRef()
       const [prevVal,setPrevVal] = useState()
       useEffect(()=>{
          setPrevVal(ref.current)
          ref.current = status
       },[status])
       return prevVal
    }
    
  3. useVisible:检测dom元素是否在浏览器视口内,它在effect中创建observer来异步观察目标元素是否与顶级文档视口相交。

    function useVisible(root:React.RefObject<HTMLElement>,rootMargin?:string) {
      const [isVisible, setIsVisible] = useState(false);
    
      useEffect(() => {
        const observer = new IntersectionObserver((entries) => {
          entries.forEach(entry => {
            setIsVisible(entry.isIntersecting);
          });
        }, {rootMargin});
    
        if (root.current) {
          observer.observe(root.current);
        }
    
        return () => {
          observer.disconnect() 
        };
      }, [root,rootMargin]);
    
      return isVisible;
    }
    
React Context API

在React应用中,为了让数据在组件间共享,常见的方式是让它们以props的形式自顶向下传递。如果数据在组件树的不同层级共享,那么这些数据必须传递到目的地,这种情况称为prop-drilling。Context如同管道,他将数据从入口直接传递到出口,使用Context可以避免出现prop-drilling。
总体而言,使用Context分为以下三步:

  1. 创建Context对象

    const MyContext = React.createContext({
       lang:"zh_CN",
       changeLang:()=>{throw Error('xxxx')}
    })
    
  2. 用Context.Provider包裹组件树
    用Context.Provider圈选Context的作用域,只有作用域内的组件才能消费Context中的数据,此处是管道的入口,在这里放入想要传递的数据。

    class ContextDemo extends React.Component{
        render(){
           <MyContext.Provider
             value={someValue}
           >
            //children
           </MyContext.Provider>
        }
    }
    
  3. 订阅Context
    订阅Context的位置是管道的出口,对于Context对象而言,管道入口只有一个,但出口可以有多个。订阅Context有3种方式。

    • 类组件的静态属性contextType。
      在类组件中使用contextType去订阅Context。用法如下。

      class MyNestedClass extends React.Component{
         static contextType = MyContext
      }
      

      contextType订阅了Context之后,除了不能在构造函数中使用this.context访问到contextvalue之外,在类组件的其他位置都能使用this.context访问到数据。React组件的shouldComponentUpdate的第三个参数是组件即将接收的context。

    • useContext。
      在函数组件中通过useContext订阅Context时,useContext的使用次数不限。用法如下。

      function MyNestedFunc(){
         const myContext = useContext(MyContext)
      }
      
    • Context.Consumer。
      Context.Consumer是react组件,在Context作用域的任何位置都能使用它,它只接收一个名为children的props,children必须是一个返回React.ReactNode的函数,该函数以context作为参数。用法如下:

      <MyContext.Consumer>
         {(context)=><MyNestedCom lang={context.lang}/>}
      </MyContext.Consumer>
      

无论如何订阅Context,只要context的值被更新,那么订阅该Context的组件一定会重新渲染,而不管context更新的那部分值是否被自己使用,也不管祖先组件是否跳过重新渲染。所以推荐将不同职责的数据保存到不同的context中,以减少不必要的重新渲染。
如果给Context.Provider的value属性传递一个对象字面量,那么Context.Provider的父组件每次重新刷新都会使得context的值发生变化,进而导致订阅该context的组件重新渲染,应当避免。

深入理解React的渲染流程
  • 类组件的生命周期流程图如下(18版本之后)。父组件重新渲染、调用this.setState()、调用this.forceUpdate()以及订阅Context的value发生变更都会导致类组件更新。
    在这里插入图片描述
    函数组件的生命周期流程如下所示:
    在这里插入图片描述
    装载是运行的惰性初始化程序指传递给useState和useReducer的函数。父组件重新渲染、状态发生变更以及订阅的Context的value发生变更都会导致函数组件更新。有图可知,上一次的effect会在组件更新后被清理,清理effect和运行effect都不会阻塞浏览器绘制。

  • 渲染流程
    渲染是React让组件根据当前的props和状态描述它要展示的内容;重新渲染是React让组件重新描述它要展示的内容。渲染和更新DOM不是同一件事情,组件经过了渲染,DOM不一定会更新。React渲染一个组件,如果组件返回的输出与上次的相同,那么它的DOM节点不需要有任何更新。
    将组件显示到屏幕上,React的工作分为如下两个阶段:

    • Render阶段(渲染阶段):计算组件的输出并收集所有需要应用到DOM上的变更。
    • Commit阶段(提交阶段):将Render阶段计算出的变更应用到DOM上。

    在Commit阶段React会更新DOM节点和组件实例的Ref。如果是类组件,React会同步运行componentDidMount或componentDidUpdate生命周期方法;如果是函数组件,React会同步运行useLayoutEffect Hooks,当浏览器绘制DOM之后,再运行所有的useEffect Hooks。

    初始化渲染之后,下面的方式会让React重新渲染组件。

    • 类组件—— 调用this.setState方法或调用this.forceUpdate方法
    • 函数组件—— 调用useState返回的setState或调用useReducer返回的dispatch
    • 其他——组件订阅的Context的value发生变更或重新调用ReactDOM.render(<AppRoot>)
  • 提高渲染性能
    要将组件显示在界面上,组件必须经过渲染流程,但是渲染有时候会被认为是浪费时间。如果渲染的输出结果没有改变,它对应的DOM节点也不需要更新,该组件的渲染工作就真的是在浪费时间。React组件的输出结果始终基于当前props和状态的值,因此,如果我们知道组件的propss和状态没有改变,那么便能让组件跳过重新渲染。

    1. shouldComponentUpdate:返回false,react将跳过重新渲染该组件的过程。使用它最常见的场景是检测组件的props和状态是否自上次以来发生变更,如果没有变更则返回false。
    2. PureComponent:它在Component的基础上添加了默认的 shouldComponentUpdate去比较组件的props和状态自上次渲染以来是否变更。
    3. React.memo:这是一个高阶组件,接收自定义组件作为参数,返回一个被包裹的组件。被包裹的组件的默认行为是检测props是否有更改,如果没有,则跳过重新渲染的过程。
    4. 如果组件在渲染过程中返回的元素的引用与上一次渲染时的引用完全相同,那么React不会重新渲染该组件。
function ShowChildren(props:{children}){
  const [count,setCount] = useState(0)
  return(
     <div>
       {count}<button onClick={()=>setCount(c=>c+1)}>click</button>
       {props.children} //点击按钮不会使其重新渲染
       <Children/> //点击按钮会使其重新渲染
     </div>
  )
}

默认情况下,只要组件重新渲染,React就会重新渲染所有被它嵌套的后代组件,即便组件的props没有变更。如果试图通过meo和PureComponent优化组件的渲染性能,那么要注意每个props的引用是否变更。

const MemoizedChildren = React.memo(Children)
function Parent(){
  const onClick=()=>{}
  return <MemoizedChildren onClick={onClick}/>
}

Parent被重新渲染会创建新的onClick函数,所以对MemoizedChildren 而言,props.onClick的引用发生变化,因此Children组件会重新渲染,如果必须让组件跳过重新渲染,可以使用useCallback。

const MemoizedChildren = React.memo(Children)
function Parent(){
    // 使用useCallback优化回调函数
  const handleClick = useCallback(() => {
    console.log('Button clicked! Count:', count);
  }, []);
  return <MemoizedChildren onClick={handleClick }/>
}
  • useCallback和useMome
  1. 功能不同:useCallback用于记忆化回调函数,而useMemo用于记忆化计算结果。

  2. 参数不同:useCallback接受一个回调函数和一个依赖项数组作为参数,只有当依赖项发生变化时,才会返回一个新的记忆化的回调函数。useMemo接受一个计算函数和一个依赖项数组作为参数,只有当依赖项发生变化时,才会重新计算并返回一个新的记忆化的计算结果。

  3. 返回值类型不同:useCallback返回一个记忆化的回调函数,而useMemo返回一个记忆化的计算结果。

  4. 使用场景不同:useCallback主要用于优化传递给子组件的回调函数,避免不必要的重新创建和渲染。useMemo主要用于优化计算操作,避免不必要的重复计算。

import React, { useState, useCallback, useMemo } from 'react';
 
function MyComponent() {
  const [count, setCount] = useState(0);
 
  // 使用useCallback优化回调函数
  const handleClick = useCallback(() => {
    console.log('Button clicked! Count:', count);
  }, [count]);
 
  // 使用useMemo优化计算结果
  const doubledCount = useMemo(() => {
    console.log('Calculating doubled count...');
    return count * 2;
  }, [count]);
 
  return (
    <div>
      <button onClick={handleClick}>Click Me</button>
      <p>Count: {count}</p>
      <p>Doubled Count: {doubledCount}</p>
    </div>
  );
}

可以看到,在上面的例子中,handleClick回调函数通过useCallback进行记忆化,只有当count发生变化时才会重新创建。而doubledCount则通过useMemo进行记忆化,只有当count发生变化时才会重新计算。这样可以避免在每次组件渲染时不必要地重新创建回调函数和重复计算结果。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

54、图论-实现Trie前缀树

思路&#xff1a; 主要是构建一个trie前缀树结构。如果构建呢&#xff1f;看题意&#xff0c;应该当前节点对象下有几个属性&#xff1a; 1、next节点数组 2、是否为结尾 3、当前值 代码如下&#xff1a; class Trie {class Node {boolean end;Node[] nexts;public Node(…

nginx配置挂载html

目标 很多软件的官方文档&#xff0c;在国内打开很慢&#xff0c;每次都得等很久&#xff0c;看到官方同时提供了html的包&#xff0c;所以想着挂载到本地nginx下&#xff0c;查看会方便很多。 下载官方html文档包&#xff0c;解压到documentation_htmls下 想添加新的文档也是…

Sql Server 数据库:查询表结构脚本

查询脚本: SELECT CASE WHEN col.colorder 1 THEN obj.name ELSE END AS 表名, col.colorder AS 序号 , col.name AS 列名 , ISNULL(ep.[value], ) AS 列说明 , t.name AS 数据类型 , col.length AS 长度 , ISNULL(COLUMNPROPERTY(col.id, col.name, Scale), 0) AS 小数位数…

<开源> 轮廓内缩外扩算法

轮廓内缩外扩算法 项目是论文A new offset algorithm for closed 2D lines with Islands的JAVA实现。 项目的GitHub地址&#xff1a;https://github.com/Lee-0o0/polygon-offset-algorithm。 参考博客 https://blog.csdn.net/qq_41261251/article/details/114462696

设计模式 -- 行为型模式

1. 行为型模式概述 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务&#xff0c;它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象行为模式&#xff0c;前者采用继承机制在类…

java开发之路——node.js安装

1. 安装node.js 最新Node.js安装详细教程及node.js配置 (1)默认的全局的安装路径和缓存路径 npm安装模块或库(可以统称为包)常用的两种命令形式&#xff1a; 本地安装(local)&#xff1a;npm install 名称全局安装(global)&#xff1a;npm install 名称 -g本地安装和全局安装…

input的type=‘radio‘设置只读属性颜色为灰色,如何修改

目录 1.设置input和label的样式为不可点击。 2.设置input的readonly属性。 3.若想变回可修改&#xff0c;用js实现 4.如何自定义radio的颜色。 5.完整代码 input的单选框有时候需要实现只读&#xff0c;两个办法&#xff0c;一个disabled&#xff0c;一个是readonly. 但d…

前期Hadoop学习总结

前期Hadoop学习总结 1.Linux&#xff1a;操作系统 ​ 2.虚拟机&#xff1a;主机 3.SecureCRT &#xff08;客户端&#xff09;&#xff1a;连接Linux 方便操作 4.Hadoop&#xff1a;软件 这个软件要装在Linux里面 5.Hadoop是干嘛的&#xff1a; Hadoop是一个开源的分布式计…

前端路由的实现原理

当谈到前端路由时&#xff0c;指的是在前端应用中管理页面导航和URL的机制。前端路由使得单页应用&#xff08;Single-Page Application&#xff0c;SPA&#xff09;能够在用户与应用交互时动态地加载不同的视图&#xff0c;而无需每次都重新加载整个页面。 在前端开发中&…

货拉拉0-1数据指标体系构建与应用

目录 一、背景 二、指标体系搭建 2.1 指标设计 2.2 指标体系搭建 2.3 指标维度拆解 三、指标标准化建设 四、指标元数据管理 五、指标应用&未来规划 原文大佬介绍的这篇指标体系构建有借鉴意义&#xff0c;现摘抄下来用作沉淀学习。如有侵权请告知~ 一、背景 指标…

什么是仪器校准报告?

在科学实验和工业生产中&#xff0c;仪器是一种非常重要的辅助工具&#xff0c;无论是测量数据、控制实验进程还是保证产品质量&#xff0c;仪器都发挥着至关重要的作用。为了确保仪器的准确性和稳定性&#xff0c;仪器校准报告这一概念应运而生。本文给大家详细介绍仪器校准报…

利用STM32的定时器和中断实现精准时间控制

⬇帮大家整理了单片机的资料 包括stm32的项目合集【源码开发文档】 点击下方蓝字即可领取&#xff0c;感谢支持&#xff01;⬇ 点击领取更多嵌入式详细资料 问题讨论&#xff0c;stm32的资料领取可以私信&#xff01; 在嵌入式系统开发中&#xff0c;精确的时间控制是许多应用的…

0元实现网站HTTP升级到HTTPS(免费https证书)

HTTPS就是在HTTP的基础上加入了SSL&#xff0c;将一个使用HTTP的网站免费升级到HTTPS主要包括以下几个步骤&#xff1a; 1 获取SSL证书 永久免费的https证书申请通道https://www.joyssl.com/certificate/select/free.html?nid16 免费的SSL证书同样能实现HTTPS&#xff0c;国…

【前端】vue的基础知识及开发指引

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Vue是什么二、学习 Vue.js 的基础知识三、熟悉 Vue.js 的生态系统四、掌握常用工具和库五、实践和项目开发六、 持续学习和跟进 前言 随着开发语言及人工智…

[Windows] Bypass分流抢票 v1.16.25 五一黄金周自动抢票软件(2024.02.08更新)

五一黄金周要来了&#xff0c;火车票难买到&#xff0c;即便官网候选订票也要看运气&#xff0c;推荐使用这个靠谱的自动抢票软件&#xff0c; 该工具是目前市面上最好用口碑最好的电脑抢票软件&#xff0c;从13年到现在&#xff0c;作者依旧在更新&#xff0c;可以自动识别123…

优秀博士学位论文分享:通往稳健在线学习的“在线集成”理论与方法

优秀博士学位论文代表了各学科领域博士研究生研究成果的最高水平&#xff0c;本公众号近期将推出“优秀博士学位论文分享”系列文章&#xff0c;对人工智能领域2023年优秀博士学位论文进行介绍和分享&#xff0c;方便广大读者了解人工智能领域最前沿的研究进展。 “CCF博士学位…

用于自动化机器陀螺仪传感器:XV7081BB

介绍一款用于自动化机器的数字输出型陀螺仪传感器XV7081BB。这款新推出的陀螺仪XV7081BB到底有什么魅力呢?我们可以用常用款用于智能割草机的XV7011BB作对比:XV7081BB提供16位或24位分辨率的角速率输出速率范围为400s。而XV7011BB采用16位角速度输出&#xff0c;检测范围为100…

软考 系统架构设计师系列知识点之大数据设计理论与实践(13)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之大数据设计理论与实践&#xff08;12&#xff09; 所属章节&#xff1a; 第19章. 大数据架构设计理论与实践 第4节 Kappa架构 19.4.2 Kappa架构介绍 Kappa架构由Jay Kreps提出&#xff08;Lambda由Storm之父Nayhan M…

48-PCIE转串口和并口电路设计

视频链接 PCIE转串口和并口电路设计01_哔哩哔哩_bilibili PCIe转串口和并口电路设计 1、PCIe转串并口电路设计基本介绍 2、PCIe转串口和并口的方案(京东) 2.1、PCIe转串口 2.1.1、ASIX (亚信)MCS9922-PCIe转2路RS232扩展卡 2.1.2、ASIX (亚信)MCS9900-PCIe转4路RS232扩展卡…

yield函数怎么理解?

目录 白话系列&#xff1a; 例子&#x1f330;&#xff1a; 什么叫暂停 yield和next搭配使用 例子&#x1f330;&#xff1a; 白话系列&#xff1a; 可以暂停&#xff0c;可以生成&#xff0c;next一个&#xff0c;yield一个 例子&#x1f330;&#xff1a; def generat…
最新文章