React 函数组件

1、定义方式

React 函数组件是指使用函数方法定义的组件。

定义方式:与函数的定义方式相同,需要将内容 return 出来,需要注意的是最外层只有一个标签或者使用<></>(Fragment 标签)包裹起来,方法写在 return 前面。

const App = () => {
const getData = () => {
return [1, 2, 3, 4, 5];
};
return (
<>
<h1>一级标题</h1>
<h2>二级标题</h2>
<h2>{getData()}</h2>
</>
);
};
export default App;

2、React Hook

由于 React 的函数组件没有生命周期。所以我们使用 Hook 来更改变量和进行数据操作。

在项目中最常用的 hook 如 useState、useEffect 以及 useRef。

2.1 useState

点击 add 数字加一,点击 sub 数字减一

import React, { useState } from "react";
export default App = () => {
const [count, setCount] = useState(0);
// 这里表示定义一个count变量,初始值为0;setCount表示对改变量进行赋值。
return (
<>
<p>{count}</p>
<button onClick={() => setCount(count + 1)}>add</button>
<button onClick={() => setCount(count - 1)}>sub</button>
</>
);
};

上述代码等同于

import React from "react";
export default class App extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0,
};
}
render() {
const { count } = this.state;
return (
<>
<p>{count}</p>
<button onClick={() => this.setState({ count: count + 1 })}>add</button>
<button onClick={() => this.setState({ count: count - 1 })}>sub</button>
</>
);
}
}

2.2 useRef

useRef 可以用于定义一个全局变量或者用于获取 DOM 元素

import React, { useRef } from "react";
export default App = () => {
const pRef = useRef("0");
const inputRef = useRef(null);
const add = () => {
pRef.current = pRef.current + 1; // 不生效
};
return (
<>
<input ref={inputRef} type="text" value="1" />
<p>{pRef.current}</p>
<button onclick={add}>add</button>
</>
);
};

2.3 useEffect

useEffect 可以看作 class 组件中的 componentDidMount 和 componentDidUpdate 函数

import React, { useState, useEffect } from "react";
const [status, setStatus] = useStatus(false);
const [data, setData] = useStatus([]); export default App = () => {
const [status, setStatus] = useState(false);
const [data, setData] = useState([]);
useEffect(() => {
setData([2, 3]);
}, []); // 在页面刚渲染完成执行(componentDidMount) useEffect(() => {
console.log("data:", data);
}, status); // 每当status改变时,执行代码 const change = () => {
setStatus(false);
if (data) {
setData([...data, data.push(1)]);
setStatus(true);
}
};
return (
<>
<p>{data}</p>
<button onClick={change}>add</button>
</>
);
};

3、Antd 中 modal 和 form 组件

Modal 和 Form 一起配合使用时,设置 destroyOnClose 也不会在 Modal 关闭时销毁表单字段数据,需要设置 Form 组件的 preserve={false}

import { Table, Button, Form, Input, Modal } from "antd";
import React, { useState, useEffect } from "react";
const FormButton = ({ open, onCancel, record, getData }) => {
const [form] = Form.useForm();
const onFinish = (values) => {
getData(values);
};
return (
<Modal
open={open}
onCancel={onCancel}
width={300}
footer={null}
destroyOnClose
>
<Form
form={form}
onFinish={onFinish}
preserve={false}
initialValues={record}
>
<Form.Item name="title" label="标题">
<Input />
</Form.Item>
<Form.Item name="content" label="内容">
<Input type="textarea" />
</Form.Item>
<Form.Item>
<Button type="primary" htmlType="submit">
提交
</Button>
<Button
htmlType="button"
onClick={onCancel}
style={{ margin: "0 8px" }}
>
取消
</Button>
</Form.Item>
</Form>
</Modal>
);
};
const App = () => {
const [open, setOpen] = useState(false);
const [data, setData] = useState(
JSON.stringify({
title: "公告",
content: "明天放假一天,注意时间分配",
})
);
const onCancel = () => {
setOpen(false);
}; const columns = [
{
title: "标题",
dataIndex: "title",
key: "title",
width: "200",
},
{
title: "内容",
dataIndex: "content",
key: "content",
width: "200",
},
];
const getData = (val) => {
console.log("提交的数据是:", val);
if (val) {
setOpen(false);
setData(JSON.stringify(val));
}
return data;
};
useEffect(() => {
getData();
}, []);
return (
<div>
<Button
type="primary"
onClick={() => {
setOpen(true);
}}
>
修改
</Button>
<FormButton
open={open}
record={JSON.parse(data)}
onCancel={onCancel}
getData={getData}
/>
<Table dataSource={[JSON.parse(data)]} columns={columns} />
</div>
);
};
export default App;

React 函数组件的更多相关文章

  1. React 函数组件中对window添加事件监听resize导致回调不能获得Hooks最新状态的问题解决思路

    React 函数组件中对window添加事件监听resize导致回调不能获得Hooks最新状态的问题解决思路 这几天在忙着把自己做的项目中的类组件转化为功能相同的函数组件,首先先贴一份该组件类组件的关 ...

  2. react hooks 如何自定义组件(react函数组件的封装)

    前言 这里写一下如何封装可复用组件.首先技术栈 react hooks + props-type + jsx封装纯函数组件.类组件和typeScript在这不做讨论,大家别白跑一趟. 接下来会说一下封 ...

  3. Android React Native组件的生命周期及回调函数

    熟悉android的童鞋应该都清楚,android是有生命周期的,其很多组件也是有生命周期.今天小编和大家分享的React Native组件的生命周期,还不了解的童鞋,赶紧来围观吧 在android开 ...

  4. React - 组件:函数组件

    目录: . 组件名字首字母一定是大写的 . 返回一个jsx . jsx依赖React,所以组件内部需要引入React . 组件传参 a. 传递. <Component list={ arrDat ...

  5. React函数类组件及其Hooks学习

    目录 函数类组件 函数式组件和类式组件的区别: 为什么要使用函数式组件? Hooks概念及常用的Hooks 1. useState: State的Hook 语法 useState()说明: setXx ...

  6. 移动web端的react.js组件化方案

     背景: 随着互联网世界的兴起,web前端开发的方式越来越多,出现了很多种场景开发的前端架构体系,也对前端的要求日益增高,早已经不是靠一个JQuery.js来做前端页面的时代了,而今移动端变化最大,近 ...

  7. React Native组件、生命周期及属性传值props详解

    创建组件的三种方式 第一种:通过ES6的方式创建 /** * 方式一 :ES6 */ export default class HelloComponent extends Component { r ...

  8. react创建组件的几种方式及其区别

    react创建组件有如下几种方式 ①.函数式定义的无状态组件 ②.es5原生方式React.createClass定义的组件   ③.es6形式的extends React.Component定义的组 ...

  9. React 面向组件化编程 - 封装了webpack - npm run build 产生的包的 /static 引用路径问题

    React 面向组件化编程 面向对象 ----> 面向模块 ----> 面向组件 套路: 注意: 组件名必须大写开头: 只能有一个根标签: <input />虚拟DOM 元素必 ...

随机推荐

  1. Python自动化之常用模块学习

    自动化常用模块 urllib和request模块学习笔记 '获取页面,UI自动化校验页面展示作用': #-*- coding : utf-8 -*-import urllib.requestimpor ...

  2. 趋势科技 redirfs模块的一个小问题

    最近看的一个问题,消息队列可以创建,但是不能获取属性,也不能发消息,返回错误为:EBADF Bad file descriptor 经过打点,确认走入了这个流程: SYSCALL_DEFINE3(mq ...

  3. centos 安装ftp服务BUG

    安装完成之后匿名可登录,但是先创建的用户名和密码无法登录,最后排查原因是/etc/pam.d/vsftpd 文件注释掉第四行 auth required pam_shells.so

  4. 第五十七篇:webpack打包发布

    好家伙,到了打包发布这一步了 1.配置打包命令: 在package.json 文件的 scripts 节点下,新增 build 命令如下: "scripts": { "d ...

  5. KingbaseES V8R6 维护管理案例之---Kstudio在CentOS 7启动故障

    ​ 案例说明: 在CentOS 7上安装KingbaseES V8R6C006数据库后,启动Kstudio图形界面启动失败,gtk动态库加载失败,安装gtk相关动态库后,问题解决. 适用版本: Kin ...

  6. KingbbaseES V8R6集群维护案例之---集群之间数据迁移

    案例说明: 生产环境是集群环境,测试环境是集群,现需要将生产环境的数据迁移到测试集群中运行,本文档详细介绍了从集群环境迁移数据的操作步骤,可以作为生产环境迁移数据的参考. 适用版本: Kingbase ...

  7. KingbaseES 导入导出blob列数据

    KingbaseES兼容了oracle的blob数据类型.通常是用来保存二进制形式的大数据,也可以用来保存其他类型的数据. 下面来验证一下各种数据存储在数据库中形式. 建表 create table ...

  8. java的URI和URL的关系

    java的URI和URL到底是什么 在我们做开发时,经常有URI和URL弄混的问题,如果当时直接看URI和URL的源码就不可能弄混.首先我总结一下URI和URL的关系:他们的关系是:URL是一种特殊的 ...

  9. kubernetes给容器生命周期设置操作事件

    Kubernetes支持预启动和预结束事件. Kubernetes在容器启动的时候发送预启动事件,在容器结束的时候发送预结束事件. 定义预启动和预结束事件操作 下面是Pod的配置文件: # cat l ...

  10. Prometheus告警处理

    在Prometheus Server中定义告警规则以及产生告警,Alertmanager组件则用于处理这些由Prometheus产生的告警.Alertmanager即Prometheus体系中告警的统 ...