React 函数组件
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 函数组件的更多相关文章
- React 函数组件中对window添加事件监听resize导致回调不能获得Hooks最新状态的问题解决思路
React 函数组件中对window添加事件监听resize导致回调不能获得Hooks最新状态的问题解决思路 这几天在忙着把自己做的项目中的类组件转化为功能相同的函数组件,首先先贴一份该组件类组件的关 ...
- react hooks 如何自定义组件(react函数组件的封装)
前言 这里写一下如何封装可复用组件.首先技术栈 react hooks + props-type + jsx封装纯函数组件.类组件和typeScript在这不做讨论,大家别白跑一趟. 接下来会说一下封 ...
- Android React Native组件的生命周期及回调函数
熟悉android的童鞋应该都清楚,android是有生命周期的,其很多组件也是有生命周期.今天小编和大家分享的React Native组件的生命周期,还不了解的童鞋,赶紧来围观吧 在android开 ...
- React - 组件:函数组件
目录: . 组件名字首字母一定是大写的 . 返回一个jsx . jsx依赖React,所以组件内部需要引入React . 组件传参 a. 传递. <Component list={ arrDat ...
- React函数类组件及其Hooks学习
目录 函数类组件 函数式组件和类式组件的区别: 为什么要使用函数式组件? Hooks概念及常用的Hooks 1. useState: State的Hook 语法 useState()说明: setXx ...
- 移动web端的react.js组件化方案
背景: 随着互联网世界的兴起,web前端开发的方式越来越多,出现了很多种场景开发的前端架构体系,也对前端的要求日益增高,早已经不是靠一个JQuery.js来做前端页面的时代了,而今移动端变化最大,近 ...
- React Native组件、生命周期及属性传值props详解
创建组件的三种方式 第一种:通过ES6的方式创建 /** * 方式一 :ES6 */ export default class HelloComponent extends Component { r ...
- react创建组件的几种方式及其区别
react创建组件有如下几种方式 ①.函数式定义的无状态组件 ②.es5原生方式React.createClass定义的组件 ③.es6形式的extends React.Component定义的组 ...
- React 面向组件化编程 - 封装了webpack - npm run build 产生的包的 /static 引用路径问题
React 面向组件化编程 面向对象 ----> 面向模块 ----> 面向组件 套路: 注意: 组件名必须大写开头: 只能有一个根标签: <input />虚拟DOM 元素必 ...
随机推荐
- 以太坊 layer2: optimism 源码学习(二) 提现原理
作者:林冠宏 / 指尖下的幽灵.转载者,请: 务必标明出处. 掘金:https://juejin.im/user/1785262612681997 博客:http://www.cnblogs.com/ ...
- 基于ASP.NET Core 6.0的整洁架构
大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. 本节将介绍基于ASP.NET Core的整洁架构的设计理念,同时基于理论落地的代码 ...
- SpringMvc(四)- 下载,上传,拦截器
1.图片下载 图片下载:将服务器端的文件以流的形式写到客户端,通过浏览器保存到本地,实现下载: 1.1 图片下载步骤 1.通过session获取上下文对象(session.getServletCont ...
- 三分钟,带你了解PLM
PLM应用于单一地点或者多个地点的企业内部.以及在产品研发领域具有协作关系的企业之间的.支持产品全生命周期的信息的创建.管理.分发和应用的综合性的应用解决方案,能够集成与产品相关的流程.应用系统和信息 ...
- k8s日志架构和基本日志
如果一个容器崩溃了.一个Pod被驱逐了.或者一个节点停机了,您通常仍然需要访问您应用程序的日志.为此,您需要一个生命周期与节点.Pod.容器相对独立的存储空间来存储应用程序日志和系统日志. 此时,我们 ...
- 查询nginx访问日志中访问次数最多的前10个IP地址
cat log | cut -d ' ' -f 1 | sort | uniq -c | sort -nr | awk '{print $0}' | head -n 10
- traefik的80和443端口占用进一步分析
上一篇文章地址:https://www.cnblogs.com/sanduzxcvbnm/p/14990065.html 建议先看上一篇文章,才更容易理解这篇 1.traefik的deployment ...
- Beats在Kibana中的集中管理
前提条件: 1.es版本是白金版 2.es开启安全设置,kibana访问es需要密码 操作步骤汇总: 1-3步是基础环境配置 4-9步是注册beats到集中管理平台,然后启动beats,只是单纯启动b ...
- kubernetes kubectl 命令自动补全
yum install -y bash-completion source /usr/share/bash-completion/bash_completion source <(kubectl ...
- 在Linux/redhat中安装amazon-ssm-agent及注意事项
操作系统:Red Hat Enterprise Linux Server release 7.9 (Maipo) 首先说明一下SSM是什么.引用官网的说明: AWS Systems Manager A ...