React构建个人博客
前言在学习react的过程中,深深的被react的函数式编程的模式所吸引,一切皆组件,所有的东西都是JavaScript。React框架其实功能很单一,主要负责渲染的功能,但是社区很活跃,衍生出了很多优秀的库和工具。个人觉得,想要做好一个项目,往往需要其他库和工具的配合,例如 项目地址: https://github.com/k-water/re... 技术栈前端
后台
此项目采用前后端分离的实现,后台接口基于RESTful规范设计,只提供数据,前端负责路由跳转,权限限制,渲染数据等。PS:由于我是个前端er,所以这里主要讲的是前端。 实现的功能
TODO
效果预览首页
内容页
用户登录
用户评论
后台管理
个人总结markdown渲染在前端渲染markdown的时候遇到了一点问题,相关的包很多,但是各种包解析的结果都有差异,react周边社区推荐的是 import ReactMarkdown from 'react-markdown' const input = '# This is a headernnAnd this is a paragraph' ReactDOM.render( <ReactMarkdown source={input} />,document.getElementById('container') ) 但是发现 import marked from 'marked' import hljs from 'highlight.js' componentWillMount() { marked.setOptions({ highlight: code => hljs.highlightAuto(code).value }) } 最后解析出来的是一个字符串,还需要将它插入 <div className="article-detail" dangerouslySetInnerHTML={{ __html: marked(output)) }} /> React组件化react的组件由dom视图和state组成,state是数据中心,它的状态决定着视图的状态。react只负责UI的渲染,与其他框架监听数据动态改变dom不同,react采用setState来控制视图的更新。setState会自动调用render函数,触发视图的重新渲染,如果仅仅只是state数据的变化而没有调用setState,并不会触发更新。说到组件,就必须了解react组件的
关于这部分的解释网上有很多,可以自行查阅。而我在开发过程用的最多的就是
这几个钩子函数了,关于性能优化,可以在 组件之间通信react是单向数据流,自上而下的传递数据。解决复杂组件之间通信的方法有很多。一般父子组件通信是最简单的,父组件将一个回调函数传递给子组件,子组件通过 如果组件之间嵌套很深,可以使用上下文getChildContext来传递信息,这样在不需要将函数一层层往下传,任何一层的子级都可以通过this.context直接访问,react-redux内部实现就是利用此方法。 兄弟组件之间无法直接通信,它们需要利用同一层的上级作为中转站。 Reduxredux不是必须的,如果不是复杂的组件通信,逻辑简单,用context就行。redux并不是react特有的,其他框架也可以使用redux。当初为了学习redux花费了不少时间,一开始并不理解redux中间的操作,看了很多前辈们写的文章才逐渐明白。简单说说redux。
store是一个对象,它主要由三个方法: 说了这么多,store的核心代码其实很短: /** * 应用观察者模式 * @param {Object} state * @param {Function} reducer */ function createStore(reducer) { let state = null const listeners = [] const subscribe = listener => listeners.push(listener) const getState = () => state const dispatch = action => { // 覆盖原对象 state = reducer(state,action) listeners.forEach(listener => listener()) } // 初始化state dispatch({}) return { getState,dispatch,subscribe } } 另一部分, function reducer(state,action) { if (!state) { return { title: { text: "water make redux",color: "red" },content: { text: "water make redux",color: "green" } } } switch (action.type) { case "UPDATE_TITLE_TEXT": return { ...state,title: { ...state.title,text: action.text } } case "UPDATE_TITLE_COLOR": return { ...state,color: action.color } } default: return state } } action比较简单,它返回一个对象,其中type属性是必须的,同时也可以传入一些其他的数据。 / 生成store const store = createStore(reducer) let oldState = store.getState() // 监听数据变化重新渲页面 store.subscribe(() => { const newState = store.getState() renderApp(newState,oldState) oldState = newState }) // 首次渲染页面 renderApp(store.getState()) store.dispatch({ type: "UPDATE_TITLE_TEXT",text: "water is fighting" }) store.dispatch({ type: "UPDATE_TITLE_COLOR",color: "#f00" }) React-redux
connect(mapStateToProps,mapDispatchToProps,mergeProps,options)(component) 也可以采用装饰器的写法,这需要babel的支持: @connect( state,{ func } ) 具体的不多介绍,迷你实现可以看看这个项目:https://github.com/k-water/ma... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |