精析React与Vue架构异同及React核心技术——涵盖JSX、组件、Props、State、生命周期与16.8版后Hooks深化解析

news2024/9/25 23:32:28

在这里插入图片描述
React,Facebook开源的JavaScript库,用于构建高性能用户界面。通过组件化开发,它使UI的构建、维护变得简单高效。利用虚拟DOM实现快速渲染更新,适用于单页应用、移动应用(React Native)。React极大推动了现代前端技术的发展与实践。

本文详细介绍了 React 与 Vue 架构区别,以及ReactJSX、组件、Props、State、生命周期函数以及自React 16.8版本引入的Hooks等主要核心语法

一、React 与 Vue 架构区别

React与Vue作为两大主流前端框架,在核心原理上有诸多相似之处,同时也存在显著差异,具体如下:

1. 共同点

  1. 组件化开发:两者均采用组件化思想构建用户界面,将复杂的UI拆分为可复用的小部件,有利于提高代码的可维护性和可重用性。
  2. Virtual DOM:React和Vue都利用虚拟DOM来提高页面渲染性能。通过在内存中维护一个DOM树的副本,计算出最小变更集,再应用到实际DOM中,减少实际DOM操作,加快页面响应速度。
  3. 数据驱动视图:两者都是数据驱动的框架,数据模型的变化会自动反映到视图上,无需手动操作DOM。
  4. 服务端渲染:都支持服务端渲染(Server Side Rendering, SSR),这有助于提升首次页面加载速度和SEO优化。
  5. 响应式更新:React和Vue都能根据状态变化自动更新UI,实现动态交互。
  6. 原生应用开发支持:React有React Native,Vue有Vue Native/Weex,两者都支持使用相同的开发语言和技术栈构建原生移动应用程序。

2. 不同点

  1. 数据绑定

    • Vue:支持双向数据绑定,开发者可以在模板中直接使用指令(如v-model)实现数据的自动同步,简化表单处理。
    • React:采用单项数据流,数据从父组件流向子组件,状态更新需要显式调用setState等方法,强调数据流向的单一性和可预测性。
  2. 模板与语法

    • Vue:使用基于HTML的模板语法,可以直接在模板中嵌入指令和表达式,更贴近传统网页开发者的习惯。
    • React:采用JSX,一种将HTML-like结构与JavaScript混写的语法,使得组件的逻辑和结构紧密耦合,便于在JavaScript环境中直接操作虚拟DOM。
  3. 状态管理

    • Vue:内置了Vuex作为官方状态管理工具,提供集中式的状态存储和管理机制。
    • React:虽然没有内置状态管理库,但社区广泛使用Redux、MobX等第三方库进行状态管理。
  4. 核心理念

    • Vue:倾向于提供一套完整的解决方案,包括路由、状态管理等,旨在降低前端开发的门槛。
    • React:更像一个库而非框架,专注于视图层,鼓励开发者根据项目需求选择合适的工具链,因此在生态上更为灵活和分散。
  5. 生命周期与更新机制

    • React:使用Fiber作为更新机制,允许更细粒度地控制渲染过程,支持并发更新和暂停恢复渲染,提高了性能和用户体验。
    • Vue:虽然也有自己的生命周期钩子和更新机制,但其更新策略相对直观和简单,对于初学者来说更容易理解。

综上所述,React和Vue虽在核心原理上有着相似的目标——提升开发效率和应用性能,但在实现细节、设计理念和生态系统上有各自的特点和优势,开发者可根据项目需求和个人喜好做出选择。

二、React 核心语法

React的核心语法主要包括以下几个方面:JSX、组件、Props、State、生命周期函数以及自React 16.8版本引入的Hooks。

1. JSX

React的核心语法之一是JSX,它是JavaScript和XML的一种混合语法,使得开发者能在JavaScript中以类似HTML的语法书写UI结构。以下是JSX的详细说明与示例:

1.1. JSX 基础

JSX允许你在JavaScript代码中直接编写看起来像HTML的标记,但实际上是JavaScript函数调用的语法糖。所有JSX最终会被转换成React.createElement()函数调用来创建React元素。

示例:基础使用
function Welcome() {
  return <h1>Hello, World!</h1>;
}

这段代码中,<h1>Hello, World!</h1>就是JSX语法。它会被转换为:

React.createElement('h1', null, 'Hello, World!');

1.2. 属性(Props)

在JSX中,你可以给元素添加属性,就像在HTML中一样。在React中,这些属性被称为“props”。

function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

const element = <Welcome name="Sara" />;

name="Sara"是传递给Welcome组件的一个prop。

1.3. 表达式与JavaScript嵌入

你可以在JSX中嵌入JavaScript表达式,使用大括号{}包裹。

function Welcome(props) {
  return <h1>Hello, {props.name.toUpperCase()}</h1>;
}

1.4. 条件渲染

在React中,可以通过条件语句来控制组件的渲染。

function Greeting(props) {
  const isLoggedIn = props.isLoggedIn;
  return (
    <div>
      {isLoggedIn ? <p>Welcome back!</p> : <p>Please log in.</p>}
    </div>
  );
}

1.5. 循环渲染

React中可以使用JavaScript的循环来渲染列表数据。

function List(props) {
  const numbers = props.numbers;
  const listItems = numbers.map((number) =>
    <li key={number.toString()}>{number}</li>
  );
  return (
    <ul>
      {listItems}
    </ul>
  );
}

ReactDOM.render(<List numbers={[1, 2, 3, 4, 5]} />, document.getElementById('root'));

注释

JSX中可以使用标准的JavaScript注释,但需要放在大括号内。

return (
  <div>
    {/* 这是一个多行JSX注释 */}
    <h1>Hello, {props.name}</h1>
  </div>
);

JSX 规则

  • JSX必须返回一个根元素。
  • 标签名必须小写(HTML标签),大写开头的是自定义组件。
  • 类名需要使用className代替class
  • 属性值必须用引号包围,即使是数字。
  • 自闭合标签需要闭合,如<img src={src} alt="img" />

以上是React中JSX的一些基础概念和示例,它是构建React应用UI的基石。

2. 组件

React组件是React应用程序的基本构建块,它们帮助你将UI分解成独立、可复用的部分。组件可以接收输入(称为props)并返回React元素,描述应该在屏幕上看到什么。下面详细介绍React组件及其使用示例。

2.1. 组件类型

React中有两种主要类型的组件:函数组件和类组件。

函数组件

函数组件是最简单的组件形式,它是一个纯函数,接收props作为参数并返回一个React元素。

function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}
类组件

类组件继承自React.Component,包含局部状态(state)和生命周期方法。

class Welcome extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}

2.2. Props

组件之间通过props传递信息。Props是只读的,不能在组件内部修改。

function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

// 使用组件时传递props
const element = <Welcome name="Sara" />;

2.3. 状态(State)

只有类组件可以拥有自己的状态(state)。状态用于存储可能会随时间变化的数据,并且当状态变化时,组件会重新渲染。

class Counter extends React.Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
  }

  incrementCount = () => {
    this.setState(prevState => ({ count: prevState.count + 1 }));
  };

  render() {
    return (
      <div>
        <p>Count: {this.state.count}</p>
        <button onClick={this.incrementCount}>Increment</button>
      </div>
    );
  }
}

2.4. 生命周期方法

React组件在不同的阶段会执行特定的方法,这些方法称为生命周期方法。不过,随着React 16.3版本及之后的更新,一些经典生命周期方法已被废弃,推荐使用新的生命周期方法和Hooks。

新的生命周期方法示例
  • componentDidMountcomponentDidUpdate 被合并为 useEffect Hook。
  • getDerivedStateFromPropsshouldComponentUpdate 可以用函数组件的逻辑直接替代。

示例:组合组件

组件可以嵌套其他组件,形成组件树。

function App() {
  return (
    <div>
      <Welcome name="Alice" />
      <Welcome name="Bob" />
    </div>
  );
}

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

总结

React组件通过组合、props传递和状态管理来构建动态用户界面。函数组件因其简洁性成为现代React开发的首选,而Hooks的引入进一步增强了函数组件的功能,减少了对类组件的依赖。理解组件的创建、props与state的使用,以及组件间的交互,是掌握React开发的关键。

3. Props

React中的props是属性(Properties)的简称,它是组件间传递信息的一种方式。通过props,父组件可以将数据和行为传递给子组件,使组件具有高度的可复用性和解耦性。以下是React Props的详细说明和示例:

3.1. Props 基本概念

  • 只读性:Props是不可变的,子组件不能修改接收到的props,以保证数据流向的单一性和组件的纯净性。
  • 传递方式:Props以JavaScript对象的形式传递,当React组件被调用时,作为参数传递给组件。
  • 使用场景:用于从父组件向子组件传递数据或函数(如事件处理器)。
  • 类型检查:React支持静态类型检查(如使用TypeScript或PropTypes),以确保组件使用正确的props类型。

基本示例

假设有一个简单的Welcome组件,它接受一个name prop来显示欢迎信息。

function Welcome(props) {
  return <h1>Hello, {props.name}!</h1>;
}

// 使用组件时传递一个name属性
const element = <Welcome name="Alice" />;

ReactDOM.render(element, document.getElementById('root'));

3.2. 默认Props

可以为props指定默认值,当父组件没有提供某个prop时,会使用默认值。

Welcome.defaultProps = {
  name: 'Stranger'
};

3.3. 解构Props

为了代码更加清晰,可以使用ES6的解构赋值直接从props提取所需属性。

function Welcome({ name }) {
  return <h1>Hello, {name}!</h1>;
}

3.4. PropTypes

为了验证传递给组件的props是否符合预期类型,可以使用PropTypes。

import PropTypes from 'prop-types';

function Welcome({ name }) {
  // ...
}

Welcome.propTypes = {
  name: PropTypes.string
};

3.5. 嵌套Props与children

除了直接定义的props外,props.children是一个特殊属性,用于获取组件间嵌套的内容。

function Card(props) {
  return (
    <div className="card">
      {props.header}
      {props.children}
      <button onClick={props.onClick}>Learn More</button>
    </div>
  );
}

// 使用Card组件,并在其中嵌入内容作为children
const cardElement = (
  <Card header="About Us">
    <p>Welcome to our company...</p>
  </Card>
);

小结

React的props机制是构建可复用、模块化UI组件的关键。通过精确控制组件间的接口,开发者可以构建复杂的应用程序,同时保持组件的独立性和可测试性。理解如何有效使用props,是掌握React开发的基础。

4. State

React中的state是组件内部的状态,它使得组件能够管理并响应自身的数据变化,进而更新UI。与props不同,state是可变的,并且只能在拥有它的组件内部进行修改。下面是React State的详细说明和示例。

4.1. State 基本概念

  • 内部状态:State是组件的私有数据,代表组件的当前状态,比如计数器的当前值、表单的输入值等。
  • 可变性:与props不同,state是可以改变的,当state发生变化时,React会自动重新渲染该组件及其子组件(如果有必要)。
  • 初始化:通常在构造函数constructor中初始化state,或者使用函数组件的useState Hook。
  • 修改规则:直接修改state是不被允许的,必须通过调用setState方法(类组件)或更新useState提供的setter函数(函数组件)来更新状态。

类组件中的State示例

class Counter extends React.Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 }; // 初始化状态
  }

  incrementCount = () => {
    this.setState(prevState => ({ count: prevState.count + 1 })); // 更新状态
  };

  render() {
    return (
      <div>
        <p>Count: {this.state.count}</p>
        <button onClick={this.incrementCount}>Increment</button>
      </div>
    );
  }
}

函数组件中的State(Hooks)

从React 16.8开始,引入了Hooks,使得函数组件也能使用state。

import React, { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0); // 初始化状态

  const incrementCount = () => {
    setCount(count + 1); // 更新状态
  };

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={incrementCount}>Increment</button>
    </div>
  );
}

State 的注意事项

  • 避免直接修改state:直接修改state可能会导致React忽略更新或出现不可预知的行为,应始终使用setState或useState提供的setter函数。
  • 状态提升:当多个组件需要共享相同的状态时,应该将状态提升到最近的共同祖先组件中。
  • 使用immer思想:虽然React setState的更新是异步的,但推荐使用immer库的思想,即通过函数(在setState中或useState的setter)接收前一个状态并返回新状态,而不是直接修改旧状态。
  • 性能优化:避免不必要的state更新,可以使用React.memo来避免不必要的渲染(对于函数组件)。

通过上述示例和说明,可以看到React的State机制是实现动态UI和组件间数据管理的关键。正确管理和更新state,是构建高效React应用的基础。

5. 生命周期函数(部分已废弃)

在React中,组件的生命周期是指组件从创建到销毁整个过程中的不同阶段,以及在这些阶段中可以执行的特定方法(也称为生命周期方法)。这些方法允许开发者在适当的时间执行代码,如初始化数据、响应用户交互或清理资源。然而,自React 16.3版本以来,一些经典生命周期方法已被标记为不安全或废弃,并推荐使用新的Hooks API来替代。

5.1. 挂载阶段

  • constructor(): 类组件实例化时调用,用于初始化state和绑定方法。
  • static getDerivedStateFromProps(): 组件实例被创建和更新时调用,根据props来计算并返回新的state或返回null。
  • render(): 必须由组件实现,用于根据当前props和state返回React元素。
  • componentDidMount(): 组件首次挂载到DOM后立即调用,适合进行DOM操作、数据获取等。

5.2. 更新阶段

  • static getDerivedStateFromProps(): 同样在更新时调用,用于基于新的props计算state。
  • shouldComponentUpdate(nextProps, nextState): 判断组件是否需要更新,返回true/false。
  • render(): 状态或props改变后,再次调用以反映最新变化。
  • getSnapshotBeforeUpdate(prevProps, prevState): 在DOM更新前调用,可以返回一个值用作componentDidUpdate的第三个参数。
  • componentDidUpdate(prevProps, prevState, snapshot): 组件更新后立即调用,适合执行副作用,如网络请求。

5.3. 卸载阶段

  • componentWillUnmount(): 组件即将卸载前调用,用于清理工作,如取消网络请求、清理定时器等。

随着React生态的发展,Hooks已经成为现代React开发的标准做法,它们提供了更灵活、易于理解和测试的组件模型。尽管经典生命周期方法在某些遗留代码中可能仍可见,但转向Hooks被视为最佳实践。

6. Hooks

React Hooks 是 React 16.8 版本引入的一个革命性特性,它允许你在函数组件中使用状态(state)和其他 React 特性,而不需要编写类组件。

React Hooks的设计理念与机制是为了简化组件的逻辑、提高代码的可读性和可维护性,同时鼓励函数式编程风格。其核心目标是将状态管理和副作用逻辑从类组件中解耦,使得这些功能可以在函数组件中直接使用。以下是React Hooks设计的主要理念、模拟生命周期的方法以及其带来的好处。

设计理念与机制

  • 单一职责原则:每个Hook专注于一个特定功能,如管理状态(useState)、处理副作用(useEffect)、获取上下文(useContext)等,这有助于保持组件的纯净性和逻辑的清晰性。

  • 函数式编程:Hooks推动使用纯函数组件,减少了类的使用,使得代码更加简洁和易于推理。

  • 组合而非继承:Hooks通过组合不同的功能,允许开发者以更模块化的方式构建组件,避免了类继承的复杂性。

6.1. useState

useState 是最基础的 Hook,它让你在函数组件中添加 state。它返回一对值:当前 state 和一个让你更新 state 的函数。

示例:

import React, { useState } from 'react';

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

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
}

6.2. useEffect

useEffect Hook 允许你在函数组件中执行副作用操作(side effects),比如数据获取、订阅或者手动修改DOM等。你可以认为它是 componentDidMount, componentDidUpdate, 和 componentWillUnmount 这三个生命周期方法的组合。

- 模拟 componentDidMountcomponentWillUnmount

  • 模拟挂载: 当你需要在组件挂载后执行一些操作,如API调用、订阅等,可以使用 useEffect,并提供一个空数组 [] 作为依赖项列表。这样,该副作用函数只会在组件挂载后和卸载前执行一次。
import React, { useEffect } from 'react';

function MyComponent() {
  useEffect(() => {
    console.log("Component did mount");
    // 这里执行挂载后的操作,如API请求
    return () => {
      console.log("Component will unmount");
      // 这里执行卸载前的清理工作,如取消API请求、清除定时器等
    };
  }, []); // 空依赖数组确保只在挂载和卸载时执行
  // ...
}

- 模拟 componentDidUpdate

  • 模拟更新: 如果你需要在组件的props或state改变后执行一些操作,可以使用 useEffect 并提供一个依赖项数组,列出所有需要监听的变化。
import React, { useState, useEffect } from 'react';

function MyComponent({ someProp }) {
  const [myState, setMyState] = useState(initialState);

  useEffect(() => {
    console.log("Component did update");
    // 这里执行更新后的操作,注意只有在someProp或myState改变时才会执行
  }, [someProp, myState]); // 依赖项数组,当这些值变化时触发执行

  // ...
}

6.3. useContext

useContext Hook 使你能够在组件树中无需显式传递 props 就能传递数据。这对于跨层级传递数据特别有用。

示例:

import React, { useContext } from 'react';
const ThemeContext = React.createContext();

function ComponentA() {
  return (
    <ThemeContext.Provider value="dark">
      <ComponentB />
    </ThemeContext.Provider>
  );
}

function ComponentB() {
  const theme = useContext(ThemeContext);
  return <div>The theme is {theme}</div>;
}

6.4. 其他 Hooks

除了上述三个基本 Hooks 外,还有更多高级 Hooks,如 useReducer 用于管理更复杂的 state 更新逻辑,useCallbackuseMemo 用于优化性能,useRef 用于创建可变的引用对象,还有useImperativeHandle, useLayoutEffect, useDebugValue 等Hooks。

React Hooks 的设计原则是让组件的逻辑更易于理解、测试和重用,减少类组件中生命周期方法的复杂性。通过组合不同的 Hooks,你可以构建出强大且灵活的功能性组件。

  • 简化组件逻辑:Hooks让组件逻辑更集中,易于理解和测试,特别是对于那些涉及状态管理和副作用处理的代码。

  • 更好的代码复用:由于Hooks是纯函数,它们可以在多个组件之间轻松复用,有助于减少重复代码。

  • 增强函数组件能力:使得函数组件也能拥有与类组件相同的功能,如状态管理、生命周期等,促进了函数式组件的广泛采用。

  • 易于调试和测试:函数组件和Hooks的简洁性降低了调试难度,同时提升了单元测试的便利性。

通过这些设计理念和机制,React Hooks显著提高了开发效率,使得React应用的构建和维护变得更加高效和愉快。

6.5. 注意事项

  • 条件执行: 类组件中可能会在生命周期方法内使用条件判断来决定是否执行某些操作,而在函数组件中,你同样可以在 useEffect 的回调函数内部进行条件判断。

  • 避免无限循环: 当在 useEffect 中修改会导致该effect重新执行的state时,要确保正确管理依赖项数组,避免造成无限循环。

结论

随着React生态的发展,Hooks已经成为现代React开发的标准做法,它们提供了更灵活、易于理解和测试的组件模型。尽管经典生命周期方法在某些遗留代码中可能仍可见,但转向Hooks被视为最佳实践。

这些核心概念构成了React应用开发的基石,熟练掌握它们是进行高效React开发的前提。

React基于组件化思想,采用虚拟DOM技术,通过对比差异最小化实际DOM操作,实现高效页面更新。其生命周期管理机制确保组件状态与UI同步。Hooks的引入,进一步提升函数组件能力,简化状态逻辑。React重视声明式编程,提升代码可读性和可维护性,对现代Web开发的效率与体验至关重要。

在这里插入图片描述

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

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

相关文章

【链表】:链表的带环问题

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;数据结构 &#x1f337;追光的人&#xff0c;终会万丈光芒 前言&#xff1a; 链表的带环问题在链表中是一类比较难的问题&#xff0c;它对我们的思维有一个比较高的要求&#xff0c;但是这一类…

51单片机入门:DS1302时钟

51单片机内部含有晶振&#xff0c;可以实现定时/计数功能。但是其缺点有&#xff1a;精度往往不高、不能掉电使用等。 我们可以通过DS1302时钟芯片来解决以上的缺点。 DS1302时钟芯片 功能&#xff1a;DS1302是一种低功耗实时时钟芯片&#xff0c;内部有自动的计时功能&#x…

Spring Boot:国际化

Spring Boot 前言国际化 前言 在 Spring MVC&#xff1a;视图与视图解析器 的文章中&#xff0c;介绍过使用 Jstl 的 fmt 标签实现国际化&#xff0c;Spring MVC 会把视图由 InternalResourceViewResolver 转换为 JstlView&#xff08;InternalResourceView 的子类&#xff09…

【DPU系列之】如何通过带外口登录到DPU上的ARM服务器?(Bluefield2举例)

文章目录 1. 背景说明2. 详细操作步骤2.1 目标拓扑结构2.2 连接DPU带外口网线&#xff0c;并获取IP地址2.3 ssh登录到DPU 3. 进一步看看系统的一些信息3.1 CPU信息&#xff1a;8核A723.2 内存信息 16GB3.3 查看ibdev设备 3.4 使用小工具pcie2netdev查看信息3.5 查看PCIe设备信息…

【JavaEE 初阶(一)】初识线程

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多线程知识 目录 1.前言2.进程3.线程4.线程和进程的区别5.Thread创建线程5.1继承Thread创建线程5.2实现R…

【深度优先搜索 图论 树】2872. 可以被 K 整除连通块的最大数目

本文涉及知识点 深度优先搜索 图论 树 图论知识汇总 LeetCode 2872. 可以被 K 整除连通块的最大数目 给你一棵 n 个节点的无向树&#xff0c;节点编号为 0 到 n - 1 。给你整数 n 和一个长度为 n - 1 的二维整数数组 edges &#xff0c;其中 edges[i] [ai, bi] 表示树中节点…

课题学习(二十三)---三轴MEMS加速度计芯片ADXL372

声明&#xff1a;本人水平有限&#xff0c;博客可能存在部分错误的地方&#xff0c;请广大读者谅解并向本人反馈错误。 一、基础配置 测量范围-200g-200g&#xff0c;分辨率为12位&#xff0c; V s 、 V D D I / O V_s、V_{DDI/O} Vs​、VDDI/O​范围为1.6V-3.5V 1.1 引脚配…

Apache和Nginx的区别以及如何选择

近来遇到一些客户需要lnmp环境的虚拟主机&#xff0c;但是Hostease这边的虚拟主机都是基于Apache的&#xff0c;尽管二者是不同的服务器软件&#xff0c;但是大多数情况下&#xff0c;通过适当的配置和调整两者程序也是可以兼容的。 目前市面上有许多Web服务器软件&#xff0c;…

Microsoft Remote Desktop Beta for Mac:远程办公桌面连接工具

Microsoft Remote Desktop Beta for Mac不仅是一款远程桌面连接工具&#xff0c;更是开启远程办公新篇章的利器。 它让Mac用户能够轻松访问和操作远程Windows计算机&#xff0c;实现跨平台办公的无缝衔接。无论是在家中、咖啡店还是旅途中&#xff0c;只要有网络连接&#xff0…

Windows平台通过MobaXterm远程登录安装在VMware上的Linux系统(CentOS)

MobaXterm是一个功能强大的远程计算工具&#xff0c;它提供了一个综合的远程终端和图形化的X11服务器。MobaXterm旨在简化远程计算任务&#xff0c;提供了许多有用的功能&#xff0c;使远程访问和管理远程服务器变得更加方便&#xff0c;它提供了一个强大的终端模拟器&#xff…

【人工智能基础】RNN实验

一、RNN特性 权重共享 wordi weight bais 持久记忆单元 wordi weightword baisword hi weighth baish 二、公式化表达 ht</sub f(ht - 1, xt) ht tanh(Whhht - 1 Wxhxt) yt Whyht 三、RNN网络正弦波波形预测 环境准备 import numpy as np import torch …

如何快速找出文件夹里的全部带有中文纯中文的文件

首先&#xff0c;需要用到的这个工具YTool&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 步骤 1、打开工具&#xff0c;切换到批量复制文件 2、鼠标移到右侧&#xff0c;点击搜索添加 3、设定查找范围、指定为文件、勾选 包含全部子文件夹&…

macOS DOSBox 汇编环境搭建

正文 一、安装DOSBox 首先前往DOSBox的官网下载并安装最新版本的DOSBox。 二、下载必备的工具包 在用户目录下新建一个文件夹&#xff0c;比如 dosbox: mkdir dosbox然后下载一些常用的工具。下载好了后&#xff0c;将这些工具解压&#xff0c;重新放在 dosbox 这个文件夹…

微服务---feign调用服务

目录 Feign简介 Feign的作用 Feign的使用步骤 引入依赖 具体业务逻辑 配置日志 在其它服务中使用接口 接着上一篇博客&#xff0c;我们讲过了nacos的基础使用&#xff0c;知道它是注册服务用的&#xff0c;接下来我们我们思考如果一个服务需要调用另一个服务的接口信息&…

ICode国际青少年编程竞赛- Python-1级训练场-识别循环规律1

ICode国际青少年编程竞赛- Python-1级训练场-识别循环规律1 1、 for i in range(4):Dev.step(6)Dev.turnLeft()2、 for i in range(3):Dev.turnLeft()Dev.step(2)Dev.turnRight()Dev.step(2)3、 for i in range(3):Spaceship.step(5)Spaceship.turnLeft()Spaceship.step(…

MySQL: Buffer Pool概念整理

一. 简介 MySQL中的Buffer Pool是InnoDB存储引擎用来缓存表数据和索引的内存区域。这是InnoDB性能优化中最关键的部分之一。通过在内存中缓存这些数据&#xff0c;InnoDB可以极大减少对磁盘I/O的需求&#xff0c;因为从内存中读取数据远比从磁盘读取要快得多。因此&#xff0c…

如何修复连接失败出现的错误651?这里提供修复方法

错误651消息在Windows 7到Windows 11上很常见&#xff0c;通常会出现在一个小的弹出窗口中。实际文本略有不同&#xff0c;具体取决于连接问题的原因&#xff0c;但始终包括文本“错误651”。 虽然很烦人&#xff0c;但错误651是一个相对较小的问题&#xff0c;不应该导致计算…

01-JDK安装(Window环境和Linux环境)

1. Windows环境安装JDK 1.1 Oracle官网下载需要版本的JDK 官网传送门https://www.oracle.com/java/technologies/downloads/#java8-windows下载完成之后 以管理员身份&#xff08;管理员&#xff01;管理员&#xff01;&#xff09;运行下载的exe文件 期间修改需要安装的路径…

【多模态】29、OCRBench | 为大型多模态模型提供一个 OCR 任务测评基准

文章目录 一、背景二、实验2.1 测评标准和结果2.1.1 文本识别 Text Recognition2.1.2 场景文本中心的视觉问答 Scene Text-Centric VQA2.1.3 文档导向的视觉问答 Document-Oriented VQA2.1.4 关键信息提取 Key Information Extraction2.1.5 手写数学公式识别 Handwritten Mathe…

【学一点儿前端】Bad value with message: unexpected token `.`. 问题及解决方法

问题 今天从vue3的项目copy一段代码到vue2项目&#xff0c;编译后访问页面报错了 Bad value with message: unexpected token ..注意到错误字符‘.’&#xff0c;这个错误通常发生在处理 JavaScript 或者 HTML 中的动态表达式中&#xff0c;日常使用二分法不断缩小报错代码范…