摘要:构建事项列表待办事项清单是使用广泛的例子,理由很充分它们是很棒的练习工具。对表单使用我们的表单应该跟踪的值并在保存提交时执行方法。记得敲哦对事项列表使用我们的事项列表也需要。在中传递这个函数我们使用方法把所有不符合的事项保存下来。
原文地址:How to Build a Todo List with React Hooks
React v16.7.0-alpha 引入了钩子(Hooks)。开心!
什么是钩子(Hooks)?钩子是能让你在没有用es6类的情况下使用React的状态, 生命周期钩子这些特性的功能。
优势:
隔离状态相关逻辑,使测试更加容易
不需要使用渲染属性或者高阶组件就可以共享状态相关逻辑
根据逻辑而不是生命周期钩子来分离应用程序的关注点
避免ES6类,因为它们很奇怪,不是真正的类,甚至会误导有经验的JavaScript开发人员
查看更多:React’s official Hooks intro
不要在生产环境使用写这篇文章时,钩子还处于内部测试(alpha)阶段。它们的API随时都可能改变。
我建议你在你的业余项目中体验钩子,在它们成为稳定版本之前,不要在线上代码中使用。
待办事项清单是使用广泛的例子,理由很充分——它们是很棒的练习工具。无论你想尝试任何语言或库我都推荐使用它。
在这个例子中,我们只实现其中的一小部分功能:
使用Material Design展示事项列表
通过input添加事项
删除事项
配置这是github和CodeSandbox的地址
git clone https://github.com/yazeedb/react-hooks-todo cd react-hooks-todo npm install
master分支已经实现了这些功能,如果你想自己跟着实现,请切到start分支。
git checkout start
启动工程
npm start
这个应用应该跑在localhost:3000上,这是初始UI:
我们已经设置了material-ui来给页面一个专业的外观,现在我们加入更多功能!
ToDoForm 组件添加一个新文件,src/TodoForm.js。这是初始代码:
import React from "react"; import TextField from "@material-ui/core/TextField"; const TodoForm = ({ saveTodo }) => { return (); }; export default TodoForm;
通过组件名字,我们就知道它是用来添加事项的,它也就是我们的第一个钩子。
useState看这段代码:
import { useState } from "react"; const [value, setValue] = useState("");
useState是一个接收初始状态(state)返回一个数组的函数。console.log 它吧。
数组的第一个值是你的state现在的值,第二个值是state的更新方法。
所以我们把它们叫做value和setValue, 并使用es6解构赋值对它们进行赋值。
对表单(Form)使用useState我们的表单应该跟踪input的值并在保存提交时执行saveTodo方法。useState能帮我们实现它。
更新updateForm.js, 这是更新之后的代码:
import React, { useState } from "react"; import TextField from "@material-ui/core/TextField"; const TodoForm = ({ saveTodo }) => { const [value, setValue] = useState(""); return (); }; export default TodoForm;
回到index.js,引入并且使用这个组件。
... import TodoForm from "./TodoForm"; ... const App = () => { return (); };Todos
现在你在input输入的值已经可以被打印出来了。(记得敲enter哦)
对事项列表(todos)使用useState我们的事项列表todos也需要state。在index.js中引入useState。初始state应该是空数组。
import React, { useState } from "react"; ... const App = () => { const [todos, setTodos] = useState([]); return ...TodoList组件
建立一个新文件:src/TodoList.js
大部分代码是来自Material-UI库的高级组件, 这是更新之后的代码:
import React from "react"; import List from "@material-ui/core/List"; import ListItem from "@material-ui/core/ListItem"; import ListItemSecondaryAction from "@material-ui/core/ListItemSecondaryAction"; import ListItemText from "@material-ui/core/ListItemText"; import Checkbox from "@material-ui/core/Checkbox"; import IconButton from "@material-ui/core/IconButton"; import DeleteIcon from "@material-ui/icons/Delete"; const TodoList = ({ todos, deleteTodo }) => ({todos.map((todo, index) => (
); export default TodoList;))} { deleteTodo(index); }} >
它接收两个属性:
todos: 事项数组,我们遍历数组,建立每一个事项
deleteTodo: 点击一个事项的删除按钮触发这个方法,它接收一个参数: 索引,这个索引唯一标识每一个事项。
在index.js中引入这个组件。
... import TodoList from "./TodoList"; import "./styles.css"; const App = () => { ...
并在App方法中使用它:
...添加事项
还是在index.js中,编辑TodoForm的属性, saveTodo:
{ const trimmedText = todoText.trim(); if (trimmedText.length > 0) { setTodos([...todos, trimmedText]); } }} />
这里我们只是把空格去掉,把新的值添加到todos中。
我们现在可以添加事项了!
清除input框现在添加新的事项后,我们没有把input清空,这是不好的用户体验!
我们只需要在TodoForm.js中做一点小改动,就可以修复它。
现在我们全部完成了!
希望你喜欢!!
谢谢!
作者:Yazeed Bzadough
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/99978.html
摘要:新的项目目录设计如下放置静态文件业务组件入口文件数据模型定义数据定义工具函数其中数据流实践的核心概念就是数据模型和数据储存。最后再吃我一发安利是阿里云业务运营事业部前端团队开源的前端构建和工程化工具。 本文首发于阿里云前端dawn团队专栏。 项目在最初应用 MobX 时,对较为复杂的多人协作项目的数据流管理方案没有一个优雅的解决方案,通过对MobX官方文档中针对大型可维护项目最佳实践的...
摘要:属性如何获取,是容器性组件负责的事情。所以,不要依赖和的值计算下一个状态。也可以使用带用回调函数参数版本的,回调函数中的会保证是最新的。当返回时,组件本次的方法不会被触发。 容器性组件(container component)和展示性组件(presentational component) 使用React编写组件时,我们需要有意识地将组件划分为容器性组件(container compo...
摘要:如何在中使用动画前端掘金本文讲一下中动画应用的部分。与的快速入门指南推荐前端掘金是非常棒的框架,能够创建功能强大,动态功能的。自发布以来,已经广泛应用于开发中。 如何在 Angular 中使用动画 - 前端 - 掘金本文讲一下Angular中动画应用的部分。 首先,Angular本生不提供动画机制,需要在项目中加入Angular插件模块ngAnimate才能完成Angular的动画机制...
阅读 1353·2021-11-25 09:43
阅读 3564·2021-11-10 11:48
阅读 4921·2021-09-23 11:21
阅读 1580·2019-08-30 15:55
阅读 3490·2019-08-30 13:53
阅读 1196·2019-08-30 10:51
阅读 819·2019-08-29 14:20
阅读 1954·2019-08-29 13:11