摘要:接下来是实战环节,我们会继续上一阶段的例子,把评论功能做得更加复杂一点。把已经发布的评论持久化,存放到浏览器的中。评论显示发布日期,如秒前,分钟前,并且会每隔秒更新发布日期。事件监听方法,。下一节中我们将介绍小书实战分析评论功能五。
React.js 小书 Lesson25 - 实战分析:评论功能(四)
本文作者:胡子大哈
本文原文:http://huziketang.com/books/react/lesson25
转载请注明出处,保留原文链接以及作者信息
在线阅读:http://huziketang.com/books/react
目前为止,第二阶段知识已经基本介绍完,我们已经具备了项目上手实战必备的 React.js 知识,现在可以把这些知识应用起来。接下来是实战环节,我们会继续上一阶段的例子,把评论功能做得更加复杂一点。
我们在上一阶段的评论功能基础上加上以下功能需求:
页面加载完成自动聚焦到评论输入框。
把用户名持久化,存放到浏览器的 LocalStorage 中。页面加载时会把用户名加载出来显示到输入框,用户就不需要重新输入用户名了。
把已经发布的评论持久化,存放到浏览器的 LocalStorage 中。页面加载时会把已经保存的评论加载出来,显示到页面的评论列表上。
评论显示发布日期,如“1 秒前”,”30 分钟前”,并且会每隔 5 秒更新发布日期。
评论可以被删除。
类似 Markdown 的行内代码块显示功能,用户输入的用 `` 包含起来的内容都会被处理成用 元素包含。例如输入 `console.log` 就会处理成
console.log
再显示到页面上。
在线演示地址。
大家可以在原来的第一阶段代码的基础上进行修改,第一、二阶段评论功能代码可以在这里找到: react-naive-book-examples。可以直接使用最新的样式文件 index.css 覆盖原来的 index.css。
接下来可以分析如何利用第二阶段的知识来构建这些功能,在这个过程里面可能会穿插一些小技巧,希望对大家有用。我们回顾一下这个页面的组成:
我们之前把页面分成了四种不同的组件:分别是 CommentApp 、CommentInput、CommentList、Comment。我们开始修改这个组件,把上面的需求逐个完成。
自动聚焦到评论框这个功能是很简单的,我们需要获取 textarea 的 DOM 元素然后调用 focus() API 就可以了。我们给输入框元素加上 ref 以便获取到 DOM 元素,修改 src/CommentInput.js 文件:
...
组件挂载完以后完成以后就可以调用 this.textarea.focus(),给 CommentInput 组件加上 ComponentDidMount 生命周期:
class CommentInput extends Component { static propTypes = { onSubmit: PropTypes.func } constructor () { super() this.state = { username: "", content: "" } } componentDidMount () { this.textarea.focus() } ...
这个功能就完成了。现在体验还不是很好,接下来我们把用户名持久化一下,体验就会好很多。
大家可以注意到我们给原来的 props.onSubmit 参数加了组件参数验证,在这次实战案例中,我们都会给评论功能的组件加上 propTypes 进行参数验证,接下来就不累述。
持久化用户名用户输入用户名,然后我们把用户名保存到浏览器的 LocalStorage 当中,当页面加载的时候再从 LocalStorage 把之前保存的用户名显示到用户名输入框当中。这样用户就不用每次都输入用户名了,并且评论框是自动聚焦的,用户的输入体验就好很多。
我们监听用户名输入框失去焦点的事件 onBlur:
... ...
在 handleUsernameBlur 中我们把用户的输入内容保存到 LocalStorage 当中:
class CommentInput extends Component { constructor () { super() this.state = { username: "", content: "" } } componentDidMount () { this.textarea.focus() } _saveUsername (username) { localStorage.setItem("username", username) } handleUsernameBlur (event) { this._saveUsername(event.target.value) } ...
在 handleUsernameBlur 中我们把用户输入的内容传给了 _saveUsername 私有方法(所有私有方法都以 _ 开头)。_saveUsername 会设置 LocalStorage 中的 username 字段,用户名就持久化了。这样就相当于每当用户输入完用户名以后(输入框失去焦点的时候),都会把用户名自动保存一次。
输入用户名,然后到浏览器里里面看看是否保存了:
然后我们组件挂载的时候把用户名加载出来。这是一种数据加载操作,我们说过,不依赖 DOM 操作的组件启动的操作都可以放在 componentWillMount 中进行,所以给 CommentInput 添加 componentWillMount 的组件生命周期:
... componentWillMount () { this._loadUsername() } _loadUsername () { const username = localStorage.getItem("username") if (username) { this.setState({ username }) } } _saveUsername (username) { localStorage.setItem("username", username) } ...
componentWillMount 会调用 _loadUsername 私有方法,_loadUsername 会从 LocalStorage 加载用户名并且 setState 到组件的 state.username 中。那么组件在渲染的时候(render 方法)挂载的时候就可以用上用户名了。
这样体验就好多了,刷新页面,不需要输入用户名,并且自动聚焦到了输入框。我们 1、 2 需求都已经完成。
小贴士这里插入一些小贴示,大家可以注意到我们组件的命名和方法的摆放顺序其实有一定的讲究,这里可以简单分享一下个人的习惯,仅供参考。
组件的私有方法都用 _ 开头,所有事件监听的方法都用 handle 开头。把事件监听方法传给组件的时候,属性名用 on 开头。例如:
这样统一规范处理事件命名会给我们带来语义化组件的好处,监听(on)CommentInput 的 Submit 事件,并且交给 this 去处理(handle)。这种规范在多人协作的时候也会非常方便。
另外,组件的内容编写顺序如下:
static 开头的类属性,如 defaultProps、propTypes。
构造函数,constructor。
getter/setter(还不了解的同学可以暂时忽略)。
组件生命周期。
_ 开头的私有方法。
事件监听方法,handle*。
render*开头的方法,有时候 render() 方法里面的内容会分开到不同函数里面进行,这些函数都以 render* 开头。
render() 方法。
如果所有的组件都按这种顺序来编写,那么维护起来就会方便很多,多人协作的时候别人理解代码也会一目了然。
下一节中我们将介绍《React.js 小书 Lesson26 - 实战分析:评论功能(五)》。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/89678.html
摘要:因为工作中一直在使用,也一直以来想总结一下自己关于的一些知识经验。于是把一些想法慢慢整理书写下来,做成一本开源免费专业简单的入门级别的小书,提供给社区。本书的后续可能会做成视频版本,敬请期待。本作品采用署名禁止演绎国际许可协议进行许可 React.js 小书 本文作者:胡子大哈本文原文:React.js 小书 转载请注明出处,保留原文链接以及作者信息 在线阅读:http://huzi...
摘要:的灵活性体现在弱类型高阶函数等语言特性上。所以近年来出现了类似和等技术,来弥补这方面的缺陷。组件参数验证在构建大型的组件库的时候相当有用,可以帮助我们迅速定位这种类型错误,让我们组件开发更加规范。下一节中我们将介绍小书实战分析评论功能四。 React.js 小书 Lesson24 - PropTypes 和组件参数验证 本文作者:胡子大哈本文原文:http://huziketang....
摘要:对于上面这个评论功能,可以粗略地划分成以下几部分评论功能的整体用一个叫的组件包含起来。每个评论列表项由独立的组件负责显示,这个组件被所使用。下一节中我们将介绍小书实战分析评论功能二。 React.js 小书 Lesson14 - 实战分析:评论功能(一) 本文作者:胡子大哈本文原文:http://react.huziketang.com/blog/lesson14 转载请注明出处,保...
摘要:修改请输入用户名请输入评论内容我们增加了和分别用于加载和保存评论列表数据。现在发布评论,然后刷新可以看到我们的评论并不会像以前一样消失。非常的不错,持久化评论的功能也完成了。下一节中我们将介绍小书实战分析评论功能六。 React.js 小书 Lesson26 - 实战分析:评论功能(五) 本文作者:胡子大哈本文原文:http://huziketang.com/books/react/...
摘要:但是给传递的评论数据并没有传递给,所以现在发表评论时没有反应的。包括实现功能之前先理解分析需求,划分组件。到此为止,小书的第一阶段已经结束,你可以利用这些知识点来构建简单的功能模块了。 React.js 小书 Lesson16 - 实战分析:评论功能(三) 本文作者:胡子大哈本文原文:http://huziketang.com/books/react/lesson16 转载请注明出处...
阅读 1376·2021-11-24 09:39
阅读 3672·2021-11-24 09:39
阅读 1846·2021-11-16 11:54
阅读 1451·2021-09-30 09:47
阅读 1685·2021-09-26 10:16
阅读 2327·2021-09-22 15:33
阅读 1433·2021-09-14 18:01
阅读 2406·2021-09-07 09:59