【react入门手册】react 基础操作-语法、特性 、路由配置

简介: 【react入门手册】react 基础操作-语法、特性 、路由配置

数据更新不渲染页面?react 函数组件避坑

react 函数组件中定义变量i = 0,页面模板上使用 i 变量,在按钮点击事件函数中修改 i++,但是页面上没有渲染,怎么回事?

在 React 函数组件中,组件的渲染是由状态(state)和属性(props)的变化触发的,而直接在函数组件中定义的变量并不会引起组件的重新渲染。


如果你想在组件中更新并重新渲染页面上的内容,你应该使用 React 的状态管理。你可以使用 useState 钩子来声明一个状态变量,并使用状态变量的更新函数来更新它。当状态变量的值发生改变时,组件将会重新渲染并展示最新的值。


以下是一个示例,展示如何在 React 函数组件中更新并渲染一个计数器:


import React, { useState } from 'react';
function MyComponent() {
  const [count, setCount] = useState(0);
  const handleClick = () => {
    setCount(count + 1);
  };
  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={handleClick}>Increment</button>
    </div>
  );
}


在上面的示例中,我们使用 useState 钩子来声明了一个名为 count 的状态变量,并将其初始值设置为 0。当点击按钮时,handleClick 函数会通过调用 setCount 函数来更新 count 的值,从而触发组件的重新渲染。最后,我们在 JSX 中展示了计数器的值,每次点击按钮时计数器会自动增加并重新渲染。


通过使用状态管理,在函数组件中更新值并触发重新渲染,可以实现页面内容的动态更新。这是 React 中推荐的做法,而直接修改函数组件外部定义的变量并不能引起组件的重新渲染。

react 中 阻止事件传播

在 React 中,可以使用 event.stopPropagation() 方法来阻止事件的默认传播。这个方法会阻止事件进一步冒泡到父元素或其他监听同一事件的子元素上。


以下是一个示例,展示如何在 React 组件中阻止事件默认传播:


function MyComponent() {
  const handleClick = (event) => {
    event.stopPropagation();
    console.log('Button clicked!');
  };
  return (
    <div onClick={() => console.log('Div clicked!')}>
      <button onClick={handleClick}>Click me</button>
    </div>
  );
}


在上面的示例中,当点击 <button> 元素时,handleClick 函数会被调用,而且由于在函数中调用了 event.stopPropagation(),所以事件不会进一步冒泡到外部的 <div> 元素。同时,父元素 <div> 上的点击事件处理函数也会被触发。


需要注意的是,在 React 中,event.stopPropagation() 方法并不会阻止事件在组件内部的其他事件处理函数中继续执行,只会阻止事件冒泡到父元素上。如果你想要完全阻止事件的默认行为和冒泡,可以使用 event.preventDefault() 方法,它会取消事件的默认行为并停止事件在整个 DOM 树中的传播。


function MyComponent() {
  const handleClick = (event) => {
    event.preventDefault();
    event.stopPropagation();
    console.log('Button clicked!');
  };
  return (
    <div onClick={() => console.log('Div clicked!')}>
      <button onClick={handleClick}>Click me</button>
    </div>
  );
}


在这个示例中,不仅阻止了事件的默认行为,还阻止了事件冒泡,确保了事件不会触发父元素上的点击事件处理函数。

typescript 中的 type

在 TypeScript 中,type 关键字用于创建类型别名(Type Aliases)。类型别名允许你为一个具体的类型或类型组合定义一个名称,以便在代码中重复使用。

type vs interface


类型别名(type是一个定义别名的工具,可以将多个类型组合起来形成一个新类型。比如特定的对象结构,联合类型、函数类型等

可以应用于以下数据类型:

  • 基本类型(如字符串、数字、布尔值等)
  • 联合类型(Union Types)
  • 交叉类型(Intersection Types)
  • 元组(Tuple)
  • 函数类型(Function Types)
  • 对象类型(Object Types)
  • 类型字面量(Type Literals)
  • 类型别名的自身引用(Recursive Type Aliases)


接口(interface主要用于定义对象的形状和结构

  • 对象类型(Object Types)
  • 类类型(Class Types)


type 的作用有以下几个方面:


  1. 类型复用: 通过类型别名,你可以将一个复杂的类型定义为一个名称,然后在需要使用该类型的地方直接使用该名称。这有助于提高代码的可读性和可维护性。
type User = {
  name: string;
  age: number;
};
type Callback = (data: User) => void;
function fetchData(callback: Callback) {
  // ...
}

在上面的例子中,通过类型别名 UserCallback 分别定义了一个用户对象类型和一个回调函数类型,然后在 fetchData 函数中使用了这两个类型别名。

  1. 类型组合: 类型别名还可以用于组合现有的类型来创建新的类型。这可以通过交叉类型(Intersection Types)和联合类型(Union Types)来实现。
type Point = {
  x: number;
  y: number;
};
type Color = 'red' | 'green' | 'blue';
type ColoredPoint = Point & { color: Color };
type Shape = Square | Circle;
interface Square {
  kind: 'square';
  size: number;
}
interface Circle {
  kind: 'circle';
  radius: number;
}

在上述代码中,ColoredPoint 类型通过交叉类型将 Point 类型和包含 color 属性的对象类型组合而成,Shape 类型通过联合类型将 SquareCircle 接口组合而成。

  1. 类型推导(Type Inference): 当你使用类型别名初始化变量时,TypeScript 可以推导变量的类型,并将其视为该类型别名所代表的类型。
type Point = {
  x: number;
  y: number;
};
const origin: Point = { x: 0, y: 0 };

在上面的例子中,通过类型别名 Point 定义了一个坐标点类型,然后通过赋值给 origin 变量,TypeScript 推导出 origin 的类型为 Point


类型别名的使用使得 TypeScript 中的类型定义更加灵活和可维护。通过使用类型别名,你可以更好地组织和管理代码中的复杂类型,提高代码的可读性和可维护性。此外,类型别名还可以与其他 TypeScript 的高级类型特性(如泛型、条件类型等)结合使用,进一步增强类型系统的能力。

【技术教学文档】

我是一个十岁的小朋友,请用简洁通俗易懂语言,介绍下ts中的xxx ,章节:

xxx

每一个章节给出实战案例代码并简要说明,案例要求生活化我能感知到的场景,最标题为md格式

react hoost 常用函数

以下是几个值得关注的常见 Hook 函数,它们能够在函数组件中实现不同的功能。我将为每个函数提供示例代码和详细说明,以便更好地理解它们的使用。


  1. useState - 用于在函数组件中管理状态。


import React, { useState } from 'react';
function Counter() {
  // 声明一个名为 count 的状态变量,初始值为 0
  const [count, setCount] = useState(0);
  // 增加 count 的值
  const increment = () => {
    setCount(count + 1);
  };
  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={increment}>Increment</button>
    </div>
  );
}


useState 函数接受一个初始状态值,并返回一个包含当前状态和更新状态的函数的数组。在上面的示例中,我们使用 useState 创建了一个名为 count 的状态变量,并使用 setCount 函数来更新它。点击 "Increment" 按钮时,count 的值会增加。


  1. useEffect - 用于在组件加载后执行副作用操作。


import React, { useState, useEffect } from 'react';
function DataFetcher() {
  const [data, setData] = useState(null);
  useEffect(() => {
    // 模拟数据获取操作
    fetch('https://api.example.com/data')
      .then(response => response.json())
      .then(data => setData(data));
  }, []);
  return <div>Data: {data}</div>;
}


useEffect 函数接受两个参数:一个副作用函数和一个依赖数组。副作用函数在组件加载后执行,并且可以执行异步操作、数据获取等。上面的示例中,我们使用 useEffect 来获取数据,并将数据保存在状态变量 data 中。空的依赖数组 [] 表示副作用函数只执行一次。


  1. useContext - 用于在函数组件中访问 React 的上下文(Context)。


import React, { useContext } from 'react';
// 创建一个上下文
const ThemeContext = React.createContext('light');
function ThemeButton() {
  // 使用 useContext 来访问上下文的值
  const theme = useContext(ThemeContext);
  return (
    <button style={{ background: theme }}>
      Button with Theme
    </button>
  );
}


useContext 函数接受一个上下文对象,并返回当前上下文的值。在上面的示例中,我们创建了一个名为 ThemeContext 的上下文,并为它指定了默认值 "light"。然后,在 ThemeButton 组件中,使用 useContext 来获取 ThemeContext 的当前值,并将其应用于按钮的样式。


这些是 React Hook 的一些常用函数示例,包括 useState、useEffect 和 useContext。它们可以用于在函数组件中管理状态、执行副作用操作和访问上下文。当然,还有其他很多有用的 Hook 函数,可以根据具体需求选择使用。


请注意,示例代码仅供参考,具体的用法可能需要根据你的项目和需求进行调整。如果你有任何进一步的问题,请随时提问!

reactRouer6 新特性


在 React Router v6 中,一些常用的组件包括:

  1. <BrowserRouter>:用于提供基于浏览器的导航功能。
  2. <Link>:用于生成导航链接,导航到指定的路由。
  3. <Route>:用于定义路由和相应的组件。
  4. <Routes>:用于定义路由配置的容器,包含多个<Route>
  5. <Outlet>:用于在父级路由组件中渲染子级路由组件。
  6. <Navigate>:用于执行编程式导航操作。
  7. <Match>:用于条件渲染组件,根据当前路由匹配结果来确定是否渲染。
  8. <UseMatch>:用于在组件中访问路由匹配信息。

这里只是列举了一些常用的组件,React Router v6 还提供了其他的功能和辅助组件。具体使用哪些组件,取决于你的需求和项目的路由配置。

需要注意的是,React Router v6 的 API 和用法与之前的版本(如 v5)有很大的变化。

可以在官方文档中找到有关 React Router v6 的更多信息:https://reactrouter.com/docs/en/v6/getting-started/introduction

react 中 .d.ts 文件声明全局变量

在 TypeScript 中,.d.ts 文件被用于声明全局变量、函数、类等的类型信息,以补充缺失或不确定的类型定义。这些声明文件不需要被导出,而是被自动地包含在项目的类型检查过程中。


当你在一个模块文件中引入一个类型声明文件(.d.ts 文件),TypeScript 会自动识别并应用其中的类型信息。你可以直接在代码中使用声明文件中声明的类型,无需手动导入。


举个例子,假设你有一个名为 globals.d.ts 的声明文件,其中声明了一个全局变量:


declare const GLOBAL_VARIABLE: string;


在其他 TypeScript 文件中,你可以直接使用 GLOBAL_VARIABLE 而不需要显式导入它:


console.log(GLOBAL_VARIABLE); // 此处的类型推导会识别 GLOBAL_VARIABLE 的类型为 string


同样的规则也适用于其他类型的声明,如全局函数、全局类等。


需要注意的是,如果你使用的是第三方库的声明文件,通常你需要使用 importrequire 语法导入该库的命名空间或模块,而不是直接使用声明文件中的类型。这是因为第三方库提供的声明文件通常会用命名空间或模块的方式导出类型,而不是全局声明。


总结起来,.d.ts 文件中的类型声明在 TypeScript 项目中会被自动包含,你可以直接在代码中使用这些类型,无需手动导出或导入。这对于增强项目的类型检查和类型推导非常有用,特别是在与第三方库的集成或处理全局变量时。

相关文章
|
11天前
|
前端开发 JavaScript
React项目路由懒加载lazy、Suspense,使第一次打开项目页面变快
本文介绍了在React项目中实现路由懒加载的方法,使用React提供的`lazy`和`Suspense`来优化项目首次加载的速度。通过将路由组件改为懒加载的方式,可以显著减少初始包的大小,从而加快首次加载速度。文章还展示了如何使用`Suspense`组件包裹`Switch`来实现懒加载过程中的fallback效果,并提供了使用前后的加载时间对比,说明了懒加载对性能的提升作用。
32 2
React项目路由懒加载lazy、Suspense,使第一次打开项目页面变快
|
19天前
|
移动开发 前端开发 JavaScript
构建高效跨平台移动应用:React Native入门指南
【8月更文挑战第47天】在移动开发领域,React Native凭借其跨平台特性和高效的开发模式赢得了开发者的青睐。本文将通过一个简易的待办事项应用实例,带领读者快速入门React Native,并展示如何利用JavaScript和React框架构建具有原生性能的应用。我们将探讨环境配置、界面布局、状态管理和数据流,以及如何打包和发布您的应用。准备好,让我们开始React Native之旅!
57 20
|
1月前
|
前端开发 Python
React技术栈-React路由插件之自定义组件标签
关于React技术栈中React路由插件自定义组件标签的教程。
45 4
React技术栈-React路由插件之自定义组件标签
|
11天前
|
前端开发
react配置proxy代理的两种方式
本文介绍了在React项目中配置代理的两种方式:通过在package.json中添加代理配置,以及通过创建setupProxy.js文件来实现更复杂的代理规则。
13 2
|
1月前
|
前端开发 JavaScript
React技术栈-React UI之ant-design使用入门
关于React技术栈中使用ant-design库的入门教程,包括了创建React应用、搭建开发环境、配置按需加载、编写和运行代码的步骤,以及遇到错误的解决方法。
24 2
React技术栈-React UI之ant-design使用入门
|
22天前
|
移动开发 前端开发 应用服务中间件
React两种路由模式的实现原理
React两种路由模式的实现原理
38 3
|
1月前
|
前端开发 程序员 API
React技术栈-React路由插件之react-router的基本使用
这篇博客介绍了React路由插件react-router的基本使用,包括其概念、API、以及如何通过实战案例在React应用中实现SPA(单页Web应用)的路由管理。
41 9
|
1月前
|
XML 存储 前端开发
React 基础入门
【9月更文挑战第1天】本文详细介绍了由Facebook开发的JavaScript库React,涵盖环境搭建、基本概念、常见问题及解决方案。首先,通过安装Node.js、npm和Create React App快速搭建开发环境;接着,讲解了JSX、组件(包括函数和类组件)、state和props等核心概念;最后,针对JSX语法错误、state异步更新及props与state混淆等问题提供了具体的解决方法和示例代码,帮助读者更好地理解和应用React。
21 2
|
2月前
|
移动开发 前端开发 JavaScript
构建高效跨平台移动应用:React Native入门指南
【8月更文挑战第31天】 在移动开发领域,React Native凭借其跨平台特性和高效的开发模式赢得了开发者的青睐。本文将通过一个简易的待办事项应用实例,带领读者快速入门React Native,并展示如何利用JavaScript和React框架构建具有原生性能的应用。我们将探讨环境配置、界面布局、状态管理和数据流,以及如何打包和发布您的应用。准备好,让我们开始React Native之旅!
|
2月前
|
开发者
告别繁琐代码,JSF标签库带你走进高效开发的新时代!
【8月更文挑战第31天】JSF(JavaServer Faces)标准标签库为页面开发提供了大量组件标签,如`&lt;h:inputText&gt;`、`&lt;h:dataTable&gt;`等,简化代码、提升效率并确保稳定性。本文通过示例展示如何使用这些标签实现常见功能,如创建登录表单和展示数据列表,帮助开发者更高效地进行Web应用开发。
32 0

热门文章

最新文章

下一篇
无影云桌面