亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

React+Redux實現簡單的待辦事項列表ToDoList

2024-04-27 15:06:05
字體:
來源:轉載
供稿:網友

使用Redux做了一個簡單的ToDoList待辦事項列表 這個例子也是源于Redux作者Dan Abramov的視頻demo 還要特別說明一下 我還沒有使用react-redux庫進行解耦(可能以后加) 也沒有拆分成多個文件等等優化 為了單純的練習redux 適合初步學習redux的同學 本人學疏才淺,發現可以優化的地方或者問題還請大家指正,謝謝

功能樣式

樣子就是這樣的 在輸入框輸入待辦事項 功能很簡單 鼠標點擊Add或者鍵盤按下Enter輸出 ShowAll顯示全部待辦事項 ShowActive顯示未完成的待辦事項(未劃掉的) ShowCrossed顯示已完成的待辦事項(劃掉的)

配置文件

使用Webpack構建的文件夾如下

webpack.config.js配置文件

module.exports = { entry: { index: './src/js/entry.js' }, output: { path: './static/dist/', publicPath: 'http://localhost:8080/static/dist/', filename: '[name].js' }, module: { loaders: [ { test: //.js$/, loader: 'babel', exclude:/node_modules/, query: { PResets: ['react', 'es2015'] } }, { test: /.less$/, loader: 'style!CSS!less' } ] }}

package.json的依賴項

{ "name": "react-demo", "version": "1.0.0", "descrhtml文件

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>React</title></head><body> <div id="root"></div> <script src="http://localhost:8080/static/dist/index.js"></script></body> </html>

腳本文件

沒有細拆文件 直接寫在入口文件entry.js了 注釋就寫在代碼里了

require('../less/index.less'); //行間樣式受限制不能添加偽類偽元素,所以還是添加了less(css)控制樣式import React from 'react';import {Component} from 'react'import ReactDom from 'react-dom';import {createStore, combineReducers} from 'redux';class ToDoList extends Component { addHandler(){ //添加待辦事項的listener let Inp = this.refs.Inp; //獲取真實DOM的輸入value if(!Inp.value){ //如果沒有輸入值,直接返回 return; } store.dispatch( //dispatch一個添加項目的action,并傳入輸入數據 { type: 'ADD_ITEM', newItem: Inp.value } ) Inp.value = ''; //提交后,清空輸入 Inp.focus(); //重置輸入焦點 } toggleHandler(item){ //Action Creator:負責提交切換中劃線的action store.dispatch( { type: 'TOGGLE_ITEM', changeID: item.ID } ); } showAllHandler(){ //Action Creator:負責showAll的action store.dispatch( { type: 'SET_FILTER', filter: 'SHOW_ALL' } ); } showActiveHandler(){ //Action Creator:負責showActive的action store.dispatch( { type: 'SET_FILTER', filter: 'SHOW_ACTIVE' } ); } showCrossedHandler(){ //Action Creator:負責showCrossed的action store.dispatch( { type: 'SET_FILTER', filter: 'SHOW_CROSSED' } ); } render(){ //渲染結構樣式 let _this = this; //緩存this let state = store.getState(); //緩存store的快照--state let {list, option} = state; //解構賦值獲取兩個子state //list是一個數組,內部數組元素是對象表示每一個列表項 //option是一個字符串,表示當先選擇的選項 switch(option){ //通過判斷當前的option字符串來決定是否過濾list數組 case 'SHOW_ACTIVE': list = list.filter(function(item){ return !item.del; }); break; case 'SHOW_CROSSED': list = list.filter(function(item){ return item.del; }); break; } document.body.addEventListener('keydown', function(e){ if(e.which == 13){ _this.addHandler(); } }); //綁定鍵盤enter事件 return ( <div> <input type="text" ref="Inp"/> //設置ref屬性為了獲取真實DOM節點 <button onClick={_this.addHandler.bind(_this)}>Add</button> <ul className="option"> <li onClick={_this.showAllHandler.bind(_this)}> <span style={{textDecoration: option!='SHOW_ALL' ? 'underline' : 'none'}}>ShowAll</span> </li> <li onClick={_this.showActiveHandler.bind(_this)}> <span style={{textDecoration: option!='SHOW_ACTIVE' ? 'underline' : 'none'}}>ShowActive</span> </li> <li onClick={_this.showCrossedHandler.bind(_this)}> <span style={{textDecoration: option!='SHOW_CROSSED' ? 'underline' : 'none'}}>ShowCrossed</span> </li> //判斷option字符串來決定三個選項的樣式 </ul> <ul className="list"> { list.map(function(item, index){ //通過list數組map映射為虛擬DOM節點 return <li key={index}> <span style={{textDecoration: item.del ? 'line-through': 'none'}} onClick={_this.toggleHandler.bind(_this, item)}>{item.item}</span> </li> }) } </ul> </div> ) }}const list = (state = [], action) => { //list-reducer switch(action.type){ case 'ADD_ITEM': return [ ...state, { item: action.newItem, //列表項內容 ID: state.length, //列表項ID del: false //列表項是否已劃掉 } ]; case 'TOGGLE_ITEM': return state.map((item)=>{ return Object.assign({},item,{ del: action.changeID == item.ID ? !item.del : item.del }); }); default: return state; }}const option = (state = 'SHOW_ALL', action) => { //option-reducer switch(action.type){ case 'SET_FILTER': return action.filter; default: return state; }}const reducer = combineReducers({list, option}); //利用redux庫API-combineReducers()合并reducerconst store = createStore(reducer); //利用redux庫API-createStore()創建storeconst render = () => { //自定義的渲染函數 ReactDom.render( <ToDoList/>, document.getElementById('root') );}store.subscribe(render); //綁定render函數,每次state更新時執行render(); //首次渲染

樣式文件

index.less文件加一些樣式控制

.option { list-style-type: none; padding: 0; margin-top: 5px; font-size: 13px; li { float: left; margin-right: 15px; span { cursor: pointer; font-weight: bold; } } &::after { content: ''; display: block; clear: both; }}.list { li { span { &:hover { color: #f40; cursor: pointer; } &::selection { color: #000; background-color: #fff; } } }}

==主頁傳送門==


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产91久久久| 日韩欧美亚洲综合| 国产精品视频资源| 精品福利在线看| 57pao国产成人免费| 九色91av视频| 日韩美女主播视频| 在线播放精品一区二区三区| 91精品国产99| 日本一区二区三区在线播放| 国产精品mp4| 国产91免费看片| 97在线看免费观看视频在线观看| 久久人人爽亚洲精品天堂| 国产精品一区二区三区在线播放| 欧美视频专区一二在线观看| 亚洲精品国产精品自产a区红杏吧| 欧美肥老太性生活视频| 国产精品狼人色视频一区| 亚洲日韩中文字幕| 亚洲天堂av网| 国产精品久久久久久久app| 粉嫩av一区二区三区免费野| 日韩欧美亚洲成人| 日韩av免费在线观看| 尤物九九久久国产精品的分类| 黄色一区二区在线观看| 日韩有码片在线观看| 日韩在线观看电影| 日韩欧美国产中文字幕| 国产精品91免费在线| 亚洲国产另类 国产精品国产免费| 亚洲xxxx在线| 日韩av男人的天堂| 久久天天躁狠狠躁夜夜躁2014| 91香蕉嫩草神马影院在线观看| 永久免费精品影视网站| 国产亚洲欧美aaaa| 一区二区三区回区在观看免费视频| 久久久久久噜噜噜久久久精品| 91精品视频播放| 国产丝袜一区二区三区| 亚洲成人激情在线观看| 亚洲天堂免费在线| 97精品视频在线| 成人伊人精品色xxxx视频| 国产狼人综合免费视频| 亚洲精品美女久久| 日韩av在线一区二区| 久久免费视频网站| 57pao国产精品一区| 久久人人爽人人| 亚洲美女福利视频网站| 久久久av亚洲男天堂| 日韩最新免费不卡| 欧美高清在线视频观看不卡| 亚洲国产成人久久综合一区| 亚洲美女黄色片| 久久精品国产亚洲| 91社区国产高清| 国产97在线视频| 久久中国妇女中文字幕| 国产色婷婷国产综合在线理论片a| 亚洲成**性毛茸茸| 成人妇女淫片aaaa视频| 国产成人精品视频在线观看| 欧美激情第一页xxx| 国产999精品久久久影片官网| 亚洲一区二区三区xxx视频| 欧美在线免费观看| 日韩精品视频在线观看免费| 国产精品69久久久久| 亚洲一区二区在线| 国产精品视频午夜| 亚洲综合日韩中文字幕v在线| 午夜精品一区二区三区在线| 日韩中文字幕在线精品| 91高潮精品免费porn| 91九色国产视频| 92版电视剧仙鹤神针在线观看| 久久91超碰青草是什么| 日韩av在线网| 欧美巨乳美女视频| 久久久久久久激情视频| 欧美专区福利在线| 久99久在线视频| 亚洲成**性毛茸茸| 国产精品丝袜白浆摸在线| 欧美视频在线观看免费| 国产z一区二区三区| 欧美精品一本久久男人的天堂| 一区二区三区 在线观看视| 成人网在线观看| 欧美一级电影在线| 欧美一区二三区| 国产精品99久久久久久白浆小说| 夜夜嗨av色综合久久久综合网| 欧美黄色三级网站| 国产一区二区三区直播精品电影| 国产精品视频免费在线观看| 日韩视频精品在线| 丝袜情趣国产精品| 亚洲网站在线看| 亚洲成人亚洲激情| 欧美日韩国产va另类| 午夜精品一区二区三区视频免费看| 欧美成人中文字幕| 一区二区三区回区在观看免费视频| 国产精品女人久久久久久| 国产精品精品视频一区二区三区| 亚洲日韩中文字幕| 欧美午夜激情小视频| 精品国产欧美一区二区三区成人| 久久精品亚洲精品| 中文字幕在线观看亚洲| 久久影院资源网| 成人免费xxxxx在线观看| 欧美性高跟鞋xxxxhd| 色悠悠国产精品| 久久久视频在线| 欧美日韩精品二区| 成人网在线免费观看| 97视频免费在线看| 亚洲午夜未删减在线观看| 欧美黄色片在线观看| 亚洲午夜久久久影院| 久久激情视频免费观看| 日韩欧美精品中文字幕| 欧美黑人性生活视频| 亚洲第一区第一页| 欧美国产在线电影| 91在线观看欧美日韩| 91免费看片网站| 中文字幕欧美日韩在线| 插插插亚洲综合网| 久久久久久国产精品| 国产成人亚洲综合91| 欧美性生交xxxxx久久久| 日韩视频免费观看| 久久九九精品99国产精品| 日韩成人激情影院| 精品日本高清在线播放| 日韩精品在线免费| 97成人在线视频| 国产精品无码专区在线观看| 亚洲国产精品悠悠久久琪琪| 91国产美女在线观看| 成人女保姆的销魂服务| 亚洲精品一区二区网址| 日韩精品在线第一页| 国产精品一区二区久久精品| 日韩乱码在线视频| 91深夜福利视频| 日本韩国在线不卡| 97久久精品在线| 久久久亚洲精品视频| 日日摸夜夜添一区| 久久久久久久一区二区| 国产精品成人一区二区三区吃奶| 国产91亚洲精品| 欧美中在线观看| 日本午夜精品理论片a级appf发布| 国产精品久久99久久| 亚洲第一中文字幕|