React Hooks 学习笔记

2023-11-12

大家好,小编最近在梳理 React Hook 的相关内容,由于看视频、看书、自己做项目总觉得缺点什么,总觉得看过了,内容太简单,有啥好写的?但是过了一段时间,感觉有些东西又模糊了。同时又觉得怕简单,写了也不一定有人看。但是想想,还是整理成文章分享出来,查漏补缺,用自己的思路和语言整理出来,方便日后的复习和查看,也希望能帮助到初学者入门。

一、开篇

React Hooks 无疑是目前 React  最令人兴奋着迷的特性之一,你可以使用更简单的函数编程的思维创建更加友好的组件。以往只有类组件才有状态管理和各种生命状态钩子函数,现在 React 16 及以后版本可以使用 useState Hooks 函数式的声明方式管理数据状态,简化生命周期相关的钩子函数等。

换句话说,我们构建React组件时不需要通过类的形式进行定义,Hooks 是一项革命性的功能,它将简化您的代码,使其易于阅读、维护、测试以及在你的项目中进行重用。现在你只需要花极短的时间进行熟悉它们,剩下的就是在实践中掌握它们。

二、环境准备

为了快速上手,小编还是建议使用官方的脚手架 Create React App ,安装命令如下:

npm i -g create-react-app

全局完成安装后,你就可以开始创建 React 应用了

npx create-react-app myapp

创建完成后,在项目目录下运行命令,启动你的 React 项目

cd myapp
npm start

三、类组件中的 State 状态管理

在学习 Hooks 中的状态管理之前,我们先复习下,在类组件中怎么进行状态管理的,有了对比,才能更好的理解  Hooks 的状态管理。示例代码如下:

import React from "react";
export default class ClassDemo extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      name: "Agata"
    };
    this.handleNameChange = this.handleNameChange.bind(this);
  }
  handleNameChange(e) {
    this.setState({
      name: e.target.value
    });
  }
  render() {
    return (
      <p>
        <form autoComplete="off">
          <p>
            <label htmlFor="name">Name</label>
            <input
              type="text"
              name="name"
              id="name"
              value={this.state.name}
              onChange={this.handleNameChange}
            />
          </p>
        </form>
        <p>Hello {this.state.name}</p>
      </p>
    );
  }
}

注:如果你是通过 Create React App 创建项目,只需要将 App.js 里的内容替换成上述内容即可。

运行你的应用程序,在浏览器里,你将会看到如下效果:


接下来,给自己一点时间,去理解上述的代码,我们在构造函数里,使用 this 的方式声明了 name 状态,并将一个 handleNameChange 函数绑定到组件实例中。在函数中,我们通过 this.setState 的方式改变状态的值。当用户在文本输入框输入值时,就会触发 handleNameChange 函数,更改 name 的状态值。

四、Hooks 中的状态管理 useState

现在,我们将使用 useState Hook 的方式改写类组件,它的语法如下所示:

const [state, setState] = useState(initialState);

useState 函数将返回一个包含两个元素的数组:

  • state: the name of your state—such as this.state.name or this.state.location(定义的数据状态)

  • setState: a function for setting a new value for your state. Similar to this.setState({name: newValue})(定义更改状态的函数或直接返回状态的值,组件状态值改变,就会触发re-render)

initialState 参数,则是初始化 state 状态的默认值(可以通过函数的形式返回值)。

基于以上基础知识后,我们来改下第三部分类组件的声明方式,示例代码如下:

import React, { useState } from "react";
export default function HookDemo(props) {
  const [name, setName] = useState("Agata");
  function handleNameChange(e) {
    setName(e.target.value);
  }
  return (
    <p>
      <form autoComplete="off">
        <p>
          <label htmlFor="name">Name</label>
          <input
            type="text"
            name="name"
            id="name"
            value={name}
            onChange={handleNameChange}
          />
        </p>
      </form>
      <p>Hello {name}</p>
    </p>
  );
}

接下来,我们在停下来思考下,这个代码与类组件有什么不同,是不是觉得代码更加紧凑容易理解了,代码少了不少,而且运行效果完全相同没有啥不同,具体的差异如下:

  • 整个类构造函数已被 useState Hook 替换,它只包含一行。

  • 由于 useState Hook 输出局部变量,因此您不再需要使用 this 关键字来引用您的函数或状态变量。老实说,这对大多数 JavaScript 开发人员来说是一个痛苦的折磨,因为并不总是清楚何时应该使用 this 。

  • JSX 代码更清晰,你可以在不使用 this.state 的情况下引用本地状态值。

注意:使用 React Hooks 时,请确保在组件顶部声明它们,不要在条件语句中声明它们。

五、多个 useState Hooks

如果有多个 useState Hooks 该怎么办呢?答案很简单:只需调用另一个 useState Hook。您可以根据需要多次声明,前提是您不会使组件过于复杂,以下代码是声明多个 useState Hooks 的示例:

import React, { useState } from "react";
export default function HookDemo(props) {
  const [name, setName] = useState("Agata");
  const [location, setLocation] = useState("Nairobi");
  function handleNameChange(e) {
    setName(e.target.value);
  }
  function handleLocationChange(e) {
    setLocation(e.target.value);
  }
  return (
    <p>
      <form autoComplete="off">
        <p>
          <label htmlFor="name">Name</label>
          <input
            type="text"
            name="name"
            id="name"
            value={name}
            onChange={handleNameChange}
          />
        </p>
        <p>
          <label htmlFor="location">Location</label>
          <input
            type="text"
            name="location"
            id="location"
            value={location}
            onChange={handleLocationChange}
          />
        </p>
      </form>
      <p>
        Hello {name} from {location}
      </p>
    </p>
  );
}

六、使用 setCount(count + 1) 还是 setCount(prev => prev + 1) ?

我们可以通过函数的方式在 setCount 进行更改状态的值,通过参数的形式获取当前状态的值,然后在此基础上进行更改,但是直接更改状态值或通过函数的形式更改状态值,有何不同呢?

  • Pass the state, Run Everytime. eg. setCount(count + 1)

  • Pass the function, Run only the very first time when your component render. ****eg. setCount(prev => prev + 1)

两种结果都是一致的,如果你懒得了解,为了避免出错,建议直接使用后者。在讲解之前,小编先出一道题,看看能否答对:

function A () {
    const [count, setCount] = useState(4);    
    setCount(count + 1);
    setCount(count + 1);
    console.log('A: ', count) // ?
}

function B () {
    const [count, setCount] = useState(4);    
    setCount(prev => prev + 1);
    setCount(prev => prev + 1);
    console.log('B: ', count) // ?
}

看完这道题,你的答案是啥?(答案:A: 5;B: 6)。有没有回答对呢?在A里面第二个setCount会覆盖第一个,因为他们的初始值都是4,但使用函数版本来设置状态会记得prevState的当前状态进行更改。

还有一个需要你关注的是,如下段代码所示 ,Pass the state 是每一次状态更改都会运行,而 Pass the function 只运行一次:

function init () {
    console.log('run function');
    return 4;
}

// Run Everytime
const [count, setCount] = useState(4);
const [count, setCount] = useState(init());

// Run only the very first time when your component render
const [count, setCount] = useState(() => init());

从上图所示,如果你使用的是函数方式的初始化状态值,每次更改状态值,只打印一次。

如果是 Object 的状态值,我们只想更改个别属性的值,为了避免出错,我们该怎么做呢?如下段代码所示:

const [state, setState] = useState({count: 4, name: 'blue'});

setState(prevState => {...prevSate, count: prevSate.count + 1}; 
console.log(state); 
// {count: 5, name: 'blue'}

setState(prevState => {count: prevSate.count + 1};
console.log(state); 
// {count: 5} name消失,因为会更改整个状态的值

七、做一个简单的购物清单

7.1、 需求描述和梳理

基础知识学完了,接下来我们就亲自动手做个练习巩固下吧,检测下是否会灵活应用了,具体的需求如下:

1、能够添加商品的名称和价格;2、展示已添加的商品列表;3、支持商品的删除;

就这些基础的需求,我们运用本篇文章的知识动手练习下吧,界面示意图如下所示:

如上图所示,我们创建三个组件: 表单组件 IngredientForm ,商品清单列表组件 IngredientList ,清单页面组件 Ingredients(将表单组件和商品清单列表组件包含在内),还有一个UI组件card(表单组件应用其样式)。

7.2 创建项目

接下来我们使用 Create React App 脚手架创建项目,删除多余的文件,最后调整后的目录结构如下图所示,保留 app.js,index.js,index.css;新建组件目录 components 和相关组件文件:

7.3、修改相关文件

接下来,我们修改原有的 index.js 文件,示例代码如下所示:

import React from 'react';
import ReactDOM from 'react-dom';

import'./index.css';
import Appfrom'./App';

ReactDOM.render(<App />, document.getElementById('root'));

//index.js

修改 app.js 文件,引入我们清单页面组件 Ingredients,示例代码如下:

import React from 'react';

import Ingredientsfrom'./components/Ingredients/Ingredients';

const  App= props => {
return <Ingredients />;
};

export defaultApp;

//app.js

最后修改我们全局的 index.css 的代码

@import url('https://fonts.googleapis.com/css?family=Open+Sans:400,700&display=swap');

* {
  box-sizing: border-box;
}

html,
body {
  font-family: 'Open Sans', sans-serif;
  margin: 0;
}

button {
  font: inherit;
  background: #ff2058;
  padding: 0.5rem 2rem;
  color: white;
  border: 1px solid #ff2058;
  margin: 0.5rem 0;
  border-radius: 5px;
  cursor: pointer;
}

button:hover,
button:active{
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.26);
}

button:focus{
  outline: none;
}

/* index.css */

由于代码比较简单,这里就不解释了,罗列代码,主要方便大家按照我的步骤一步步的完成。

7.4、表单组件 IngredientForm

我们在 components 目录下新建一个目录 Ingredients,这个目录下存放一些和清单业务相关的组件,接下来我们创建一个清单表单组件 IngredientForm,基于需求,可以抽象出一个公共的UI组件Card, 将表单组件  IngredientForm 放置其中。

1、在UI目录下新建 Card.js 组件,示例代码如下:

import React from 'react';

import'./Card.css';

constCard= props => {
return <div className="card">{props.children}</div>;
};

export defaultCard;

//components/UI/Card.js

这里我们使用了 props.children ,这个特性可以包含子组件,我们就可以在其中嵌套我们的表单组件了。

.card{
  padding: 1rem;
  border-radius: 5px;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.26);
}

/* components/UI/Card.css */

2、新建 IngredientForm.js 表单组件文件

基于需求,这里我们有两个表单输入框和提交按钮,分别用于录入商品名称、单价和提交数据。这里我们就可以用到 Hooks 的状态值了,初始化内容为空,这里我们定义了 enteredTitle,enteredAmount 两个状态值,同时在提交按钮上绑定了一个属性方法 submitHandler,通过子组件向父组件传值的形式,将当前用户操作更改的状态值传递给父组件 Ingredients,说了这么多,还是看看代码吧,示例代码如下:

import React, {useState} from'react';

import Card from'../UI/Card';
import'./IngredientForm.css';

const IngredientForm = React.memo(props => {
const [enteredTitle, setEnteredTitle] =useState('');
const [enteredAmount, setEnteredAmount] =useState('');

const submitHandler = event => {
    event.preventDefault();
    props.onAddIngredient({ title: enteredTitle, amount: enteredAmount });
  };

return(
    <p className="ingredient-form">
      <Card>
        <form onSubmit={submitHandler}>
          <div className="form-control">
            <labelhtmlFor="title">商品名称</label>
            <input
type="text"
id="title"
value={enteredTitle}
onChange={event => {
                set EnteredTitle(event.target.value);
              }}
            />
          </div>
          <div className="form-control">
            <label htmlFor="amount">单价</label>
            <input
type="number"
id="amount"
value={enteredAmount}
onChange={event => {
                setEnteredAmount(event.target.value);
              }}
            />
          </div>
          <div className="ingredient-form__actions">
            <button type="submit">添加</button>
          </div>
        </form>
      </Card>
    </p>
  );
});

export default IngredientForm;

//components/Ingredients/IngredientForm.js

3、新建 IngredientForm.css 文件

.ingredient-form{
  width: 30rem;
  margin: 2rem auto;
  max-width: 80%;
}

.form-control label,
.form-control input {
  display: block;
  width: 100%;
}

.form-control input {
  font: inherit;
  padding: 0.1rem 0.25rem;
  border: none;
  border-bottom: 2px solid #ccc;
  margin-bottom: 1rem;
}

.form-control input:focus{
  outline: none;
  border-bottom-color: #ff2058;
}

.ingredient-form__actions{
  display: flex;
  justify-content: space-between;
  align-items: center;
}

/* components/Ingredients/IngredientForm.css */

CSS代码比较简单这里就不过多介绍了。

7.5、 购物清单列表组件 IngredientList

1、列表组件  IngredientList.js

接下来新建一个列表组件  IngredientList,显示已添加的商品清单,这里包含两个属性,组件属性 ingredients (父组件向子组件传值)和 一个删除事件的函数 onRemoveItem(向引用的父组件传值)。示例代码如下,比较简单,在这里就不过多解释了:

import React from 'react';

import'./IngredientList.css';

const IngredientList = props => {
return(
    <p className="ingredient-list">
      <h2>我的购物清单</h2>
      <ul>
        {props.ingredients.map(ig => (
          <li key={ig.id} onClick={props.onRemoveItem.bind(this, ig.id)}>
            <span>商品名称:{ig.title}</span>
              <span>单价:{ig.amount}</span>
            <span>删除</span>
          </li>
        ))}
      </ul>
    </p>
  );
};

export default IngredientList;

//components/Ingredients/IngredientList.js

2、新建 IngredientList.css

.ingredient-list{
  width: 30rem;
  max-width: 80%;
  margin: auto;
}

.ingredient-list h2 {
  border-bottom: 3px solid #ccc;
  padding-bottom: 1rem;
}

.ingredient-list ul {
  list-style: none;
  margin: 0;
  padding: 0;
}

.ingredient-list li {
  margin: 1rem 0;
  padding: 0.5rem 1rem;
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.26);
  display: flex;
  justify-content: space-between;
}

/* components/Ingredients/IngredientList.css */

7.6、 购物清单页 Ingredients

最后我们新建父组件容器页面 Ingredients.js,将我们刚才创建的列表组件 IngredientList 和  IngredientForm 组件放置其中。

1、运用 State Hook 的数据状态的特性,声明 userIngredients 数据状态, 用于向子组件 IngredientList 的 ingredients 属性传值,渲染购物清单的商品列表。

2、接下来我们继续声明添加购物清单函数 addIngredientHandler(), 将其绑定至 IngredientForm 子组件的 onAddIngredient 属性,此函数用于接收子组件的传值,通过 setUserIngredients 方法,声明函数的形式将接收的值添加至当前状态的数组中。

3、最后我们添加删除指定商品的函数 removeIngredientHandler(),将其绑定至 IngredientList 的属性 onRemoveItem,用于接收子组件传过来的商品ID,通过在  setUserIngredients 方法里定义函数的形式更改数据状态,借助数组的 filter 方法筛选非当前商品 ID 的内容。

说了这么多,还是看代码比较直接,示例代码如下:

import React, {useState} from'react';

import IngredientForm from './IngredientForm';
import IngredientList from './IngredientList';

const Ingredients= () => {
const [userIngredients, setUserIngredients] =useState([]);

const addIngredientHandler = ingredient => {
    setUserIngredients(prevIngredients => [
      ...prevIngredients,
      { id: Math.random().toString(), ...ingredient }
    ]);
  };

const removeIngredientHandler = ingredientId =>{
    setUserIngredients(prevIngredients=>
        prevIngredients.filter(ingredient => ingredient.id !== ingredientId)
    );
  };

return(
    <divc className="App">
      <IngredientForm onAddIngredient={addIngredientHandler} />

      <p>
        <IngredientList ingredients={userIngredients} onRemoveItem={removeIngredientHandler} />
      </p>
    </div>
  );
};

export default Ingredients;//components/Ingredients/IngredientList.js

7.7、完成后,运行项目

到这里,购物清单的练习项目就完成了,在当前项目目录下运行 npm start,如果一切正常你就会看到如下视频所示的效果。

这个示例比较简单,你可以继续完善下,比如添加成功清空当前表单输入框的内容、过滤商品名称避免重复添加等

八、结束语

好了,今天关于 State Hook 的部分就介绍完了,本篇文章有些长,感谢你的阅读,你可以点击阅读原文体验购物清单的交互效果,如果你想获取源码请回复"r1",小编建议你亲自动手做一下,这样才能加深对 State Hook 的认知,下一篇本系列文章将会介绍 useEffect,敬请期待。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React Hooks 学习笔记 的相关文章

  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • JavaScript 中的实时摩尔斯电码转换器

    在看到谷歌关于莫尔斯电码 gmail 的愚人节笑话后 我想我应该尝试用 javascript 创建一个实时莫尔斯电码转换器 我正在使用正则表达式和替换将莫尔斯电码更改为字符 例如 replace g a replace g r 我遇到的问题
  • 如何在 Maven 中显示消息

    如何在 Maven 中显示消息 在ant中 我们确实有 echo 来显示消息 但是在maven中 我该怎么做呢 您可以使用 antrun 插件
  • Android中webview的截图方法

    我在 webview 中的 html5 canvas 上画了一些线 并尝试使用下面的代码截取 webview 的屏幕截图 WebView webView WebView findViewById R id webview webView s
  • 运行 Jar 文件时出现问题

    我已将 java 项目编译成 Jar 文件 但运行它时遇到问题 当我跑步时 java jar myJar jar 我收到以下错误 Could not find the main class myClass 类文件不在 jar 的根目录中 因
  • Keycloak - 自定义 SPI 未出现在列表中

    我为我的 keycloak 服务器制作了一个自定义 SPI 现在我必须在管理控制台上配置它 我将 SPI 添加为模块 并手动安装 因此我将其放在 module package name main 中 并包含 module xml 我还将其放
  • 如何配置eclipse以保持这种代码格式?

    以下代码来自 playframework 2 0 的示例 Display the dashboard public static Result index return ok dashboard render Project findInv
  • 查看Jasper报告执行的SQL

    运行 Jasper 报表 其中 SQL 嵌入到报表文件 jrxml 中 时 是否可以看到执行的 SQL 理想情况下 我还想查看替换每个 P 占位符的值 Cheers Don JasperReports 使用 Jakarta Commons
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • Python:如何在不先创建整个列表的情况下计算列表的总和?

    通常我们必须 1 声明一个列表 2 使用以下方法计算该列表的总和sum 但现在我希望指定一个以 1 开头 间隔为 4 100 个元素的列表 如下所示 1 5 9 13 17 21 25 29 33 37 我不想涉及数学公式 所以 1 如何在
  • 检测浏览器选项卡是否具有焦点

    是否有可靠的跨浏览器方法来检测选项卡是否具有焦点 场景是 我们有一个定期轮询股票价格的应用程序 如果页面没有焦点 我们可以停止轮询并为每个人节省流量噪音 特别是当人们喜欢打开具有不同投资组合的多个选项卡时 Is window onblur
  • 具有固定顶部菜单的语义 UI 侧边栏

    Semantic UI 对其进行预警侧边栏页面 http semantic ui com modules sidebar html usage 当侧边栏出现时 固定位置内容可能会出现改变其位置的问题 然后它提供了该问题的两种可能的解决方案
  • AngularJS 在指令运行之前通过 AJAX 检索数据

    我正在使用 AngularUIuiMap http angular ui github com directives map实例化谷歌地图的指令 uiMap 指令非常适合处理硬编码数据 mapOptions and myMarkers 但是
  • 使用 pandas 单元格中列表的长度选择行[重复]

    这个问题在这里已经有答案了 我有一张表 df a b c 1 x y x 2 x z c d 3 x t e f g 只是想知道如何使用 c 列的长度选择行 such as df loc len df c gt 1 我知道这是不对的 正确的
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • 如何使用 Python/Django 在 Facebook 中获取(和使用)扩展权限

    我正在尝试编写一个简单的应用程序 让用户授予我的代码写入其页面的 Facebook 流的权限 据我了解 它应该很简单 让用户单击一个按钮 启动一个弹出窗口 其中包含我的 Facebook 应用程序中的页面 在该页面中 他们单击授予的内容流发
  • D3 将现有 SVG 字符串(或元素)追加(插入)到 DIV

    我到处寻找这个问题的答案 并找到了一些我认为可能有用的资源 但最终没有让我找到答案 这里有一些 外部SVG http bl ocks org mbostock 1014829 嵌入SVG https stackoverflow com qu
  • JAVA - 如何从扫描仪读取文件中检测到“\n”字符

    第一次海报 我在读取文本文件的扫描仪中读取返回字符时遇到问题 正在读取的文本文件如下所示 test txt start 2 0 30 30 1 1 90 30 0 test txt end 第一行 2 表示两个点 第二行 位置索引 0 xp
  • java8 Collectors.toMap() 限制?

    我正在尝试使用java8Collectors toMap on a Stream of ZipEntry 这可能不是最好的想法 因为在处理过程中可能会发生异常 但我想这应该是可能的 我现在收到一个我不明白的编译错误 我猜是类型推理引擎 这是
  • 用javascript调用外部网页(跨域)

    我正在尝试使用以下网络服务来验证提要这个问题 https stackoverflow com questions 11996430 check if a url is a valid feed 但浏览器不允许我向另一台服务器发送 ajax

随机推荐

  • 基于Docker搭建Redis7.0主从哨兵集群高可用模式

    Docker搭建Redis主从哨兵模式 本文基于docker compose Redis7 0版本搭建Redis1主2从3哨兵高可用集群 不同版本redis配置文件略有差异 请参考官方文档Github地址与Redis官网地址 如下图可以看出
  • 微信怎么发匿名消息 微信发匿名消息方法【详解】

    很多小伙伴加了微信好友后 有些话难以说出口 想给对方发送一些匿名消息 掩盖自己的身份 保护个人隐私 这要怎么做呢 小编今天就为大家支个招 轻松搞定匿名消息设置方法 赶紧来看看吧 微信怎么发匿名消息 1 打开微信 搜索 匿名的信 点击进入匿名
  • 评测:对接GPT-4的NewBing使用体验变化

    GPT 4是OpenAI发布的最新一代语言模型 于2023年3月14日正式发布 并通过API和ChatGPT Plus平台向用户开放 微软也证实 在GPT 4正式发布之前 就已经在部分版本的Bing中使用GPT 4技术 本文旨在对使用GPT
  • 华为OD机试真题 Java 实现【寻找符合要求的最长子串】【2023Q1 200分】

    一 题目描述 给定一个字符串 s 找出这样一个子串 该子串中的任意一个字符最多出现2次 该子串不包含指定某个字符 请你找出满足该条件的最长子串的长度 二 输入描述 第一行为要求不包含的指定字符 为单个字符 取值范围 0 9a zA Z 第二
  • 在ubuntu上安装qt

    1 登录VM 上网下载Qt 保存路径一般在下载文件夹 可以下载后放到自定义文件夹 2 下载完成后 cd到保存文件的文件夹 并执行命令 sudo chmod a x qt opensource linux x64 5 9 run 将文件改变成
  • 数据结构进阶(一)

    更多内容可以访问我的个人博客 1 二叉查找树 参考 深入学习理解二叉搜索树 附详细讲解与实例分析 1 1 基本概念 二叉查找树 也称二叉搜索树 或二叉排序树 其要么是一颗空树 要么就是具有如下性质的二叉树 1 若任意节点的左子树不空 则左子
  • FPGA编程入门:Quartus II 设计1位全加器

    FPGA编程入门 Quartus II 设计1位全加器 一 半加器和1位全加器原理 一 半加器 二 1位全加器 二 实验目的 三 Quartus II设计半加器 一 新建工程 二 创建原理图 三 将设计项目设置成可调用的元件 四 半加器仿真
  • Centos 下安装使⽤ Memcache

    1 美图 2 安装 在 Centos 下安装使 用 yum 命令安装 Memcache 非常简单 yum install y memcached 启动 usr bin memcached b p 11211 m 150 u root gt
  • Linux-getopt命令详解

    getopt命令记录 简介 格式说明 要点 使用 简介 getopt命令可以接受一系列任意形式的命令行选项和参数 并自动将它们转换成适当的格式 格式说明 getopt三种使用方式 第一种 无法处理带有空格的参数 getopt optstri
  • c++void函数如何返回处理结果

    文章目录 一 void函数 二 void函数通过引用和指针返回处理结果 一 void函数 void在函数和变量中的含义详解 void表示无类型的意思 无类型可以包容有类型 可以用其定义的函数获得各种想要输出的数据类型 比如各个视觉库自定义的
  • java流

    java流 字节流 fr new FileReader E javaTxt adc txt fw new FileWriter E javaTxt adc txt 字符流 fis new FileInputStream E javaTxt
  • .gitignore文件不生效解决方法

    创建git仓库 忘记创建 gitignore 文件 导致提交的时候检测出一堆 DS Store node modules 等无需提交的文件 这个时候添加 gitignore 文件 如果是还没有提交 重新打开下编辑器就好了 编辑器是VS Co
  • Java 集合根据条件进行拆分

    创建测试集合 List
  • typescript学习(四)——泛型

    泛型 泛型 软件工程中 不仅要创建一致的定义良好的API 同时也要考虑可重用性 组件不仅能够支持当前的数据类型 同时也能支持未来的数据类型 这在创建大型系统时提供了十分灵活的功能 在像c 和java这样的语言中 可以使用泛型来创建可重用的组
  • 从C语言出发新角度内核剖析C++函数重载(千字精品,附带大厂面试问题回答)

    目录 C角度引入 函数重载 1 什么是函数重载 2 函数重载的优点 3 函数重载的特性 剖析函数重载 最后做一个小补充 大厂面试题 C角度引入 首先在进行C 讲解之前我们照例先来谈谈C语言是如何做的 在C语言中是没有函数重载存在的 每一个函
  • hibernate 关系映射文件配置

  • 1、Java实现队列(Queue)的方式

    编程题目 1 请用Java实现队列 Queue 队列实现的三种方式 1 通过数组实现一个队列 2 通过集合实现一个对列 3 通过两个堆栈实现一个队列 示例代码 1 通过数组实现一个队列 package program stack array
  • conda更新失败--更新后版本号不变

    我们通常使用下面的命令更新conda conda update n base c defaults conda 然而 这个命令有时候失效 如在我电脑上 4 10 0版本的conda一直无法升级为最新的23 3 1版本 失效情况 在更新前的状
  • vue 数字变星号 过滤器_Vue自定义过滤器格式化数字三位加一逗号实现代码

    前端处理一些金额 数字类的数据要求按照固定的格式显示 比如9 527 025 或者带有小数 如1 587 23 仍要三位一断 有些话也不必多说 既然要求如此 实现呗 作为前端主流框架之一的Vue 类似的功能肯定都有人写的很完善了 我呢 最讨
  • React Hooks 学习笔记

    大家好 小编最近在梳理 React Hook 的相关内容 由于看视频 看书 自己做项目总觉得缺点什么 总觉得看过了 内容太简单 有啥好写的 但是过了一段时间 感觉有些东西又模糊了 同时又觉得怕简单 写了也不一定有人看 但是想想 还是整理成文