Cnode
基于react编写的cnodejs论坛第三方webapp
Install / Use
/learn @lumia2046/CnodeREADME
项目简介
一个WebApp版的cnode客户端,项目采用react技术栈构建。组件选用的是Material-UI,让界面更适合触控操作。
- 感谢来自cnodejs论坛官方提供的api!
功能
- 首页列表,下拉时自动加载下一页,在顶端上拉刷新
- 主题详情,登陆后能够收藏,评论和点赞
- 消息提醒,能查看消息详情和清空所有未读消息
- 个人主页,包括最近参与,回复,以及收藏的主题
- 发表主题,成功后能跳转到相应主题页面
- 页面后退,能还原数据和滚动位置
运用的技术主要有:
- 采用react技术栈,通过Redux来管理页面状态,通过Router来设置页面路由
- 组件选用的是Material-UI,不再自己造轮子,既美观又能方便触控操作
- 使用react-route v4 和 react原生的react-transition-group v2 来实现路由切换动画
- 使用react-flip-move插件来实现list的加载动画
- 应用
isomorphic-fetch库代替XMLHttpRequest实现网络请求 - 使用
PostCSS对CSS进行预处理 - 通过
CSSModules处理模块内部的类名
预览
运行项目
git clone https://github.com/lumia2046/cnode.git
cd cnode
npm install
npm start
打开浏览器访问:http://localhost:5678
生产项目
windows下
npm run build-win
linux、mac下
npm run build-win
<!--
## 状态树
本项目使用redux管理状态,状态树如图:

基本思路是每个页面对应一个reducer,管理本页面的状态。其中:
- `homePage`对应主页信息,还包括了浏览的主题类别等状态
- `article`对应文章内容页面,能缓存多篇,所以状态信息中提供了当前正在阅读的主题信息
- `login`对应登陆账号的信息页面,包括是否登录成功等状态
- `profile`代表用户的信息页面,比如用户名,积分情况等,还包括发表、回复和收藏的主题
- `publishTopic`对应发表主题页面,包括主题是否发送成功等状态
- `message`对应登陆账号的消息界面,还包括了未读消息是否被标记已读等状态
## 总结
- 对react组件及其生命周期有了更深入的了解
- 如果需要在组件更新的生命周期里setState(),应该在componentWillReceiveProps(或者componentWillUpdate)里通过对this.props和newProps里面的属性做出准确判断后再去setState(),否则会导致组件更新死循环以致页面卡死
- 在组件的生命周期里调用dispatch发送不带异步的action时,每发送一个action都会更新一次store。但是在事件回调的方法里多次调用dispatch发送不带异步的action时,只会在最后一个action发送完毕才更新一次store,想要每次action都更新store,那么必须手动将其封装为异步操作
- 公共组件最好不要设置自己的状态,应该由父组件管理其状态
- 对es6有了更深入的了解
- 当采用es5写法时,React 自动将组件绑定给所有的事件回调方法中的this,这种自动绑定的行为只适用于当组件是用 React.createClass 创建时。如果用 ES6 的类来定义组件,那么事件方法中 this 的值就是 undefined,除非你自己显式绑定它
- 为了省略es6中事件方法的绑定,可以将事件方法写成箭头函数的形式,这种写法在react文档中标注为es7+,eg: 把handleClick(){}写成handleClick = () => {}即可,但是react生命周期函数不支es7+这种写法
- 利用扩展运算符和对象的解构赋值极大的简化了react组件间props的传递的书写。
eg: < Reply {...({login,dispatch,profile})} / >只需这样,就可以把login,dispatch,profile三个变量当作props传递给Reply组件,需要注意的是解构对象本身时必须用括号括起来,否则解析器会把{}里的内容理解成一个代码块,而不是赋值语句
- 对React技术栈有了深入的了解
- react-router的history属性,当设置为browerHistory时,需要对服务器改造。否则用户直接向服务器请求某个子路由,会显示网页找不到的404错误。
- redux通过connect连接react组件,只有mapStateToProps里return的对象的属性发生改变,组件才会去更新。store中有的但是return的对象里不存在的属性改变时,组件不会去更新,因为这样没有意义
- 使用了模块化编程后,页面整体逻辑变得清晰很多,每个模块里的css和js都只负责管理一个对应的组件。尤其是用了css这一块,用css-loader开启CSS-Modules后,就再也不用为类名的语义化和重复去烦恼 -->Related Skills
node-connect
345.4kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
104.6kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
345.4kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
345.4kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
