├── .idea ├── .name ├── misc.xml ├── modules.xml ├── vcs.xml ├── web-front-end-thinking-tutorial.iml └── workspace.xml ├── README.md └── practice ├── autoComplete.js ├── index.html ├── lxy ├── 1 │ ├── 1.js │ ├── 2.js │ ├── 3.js │ ├── 4.js │ ├── 5.js │ ├── 6.js │ ├── 7.js │ └── 8.js └── 2 │ └── 2-1.html ├── machi ├── 1 │ ├── anwser.js │ ├── index1.html │ └── note_1.md ├── 2 │ ├── autoComplete.js │ └── index.html └── 3 │ └── note.md ├── wuhuizhong ├── 1 │ ├── README.md │ └── index.html ├── 2 │ ├── README.md │ ├── main.html │ └── main.js └── 3 │ ├── React笔记.md │ └── 个人总结.md └── yuwei ├── 1 └── answer.js ├── 2 └── .idea │ ├── .name │ ├── 2.iml │ ├── misc.xml │ ├── modules.xml │ ├── vcs.xml │ └── workspace.xml ├── 3 ├── .babelrc ├── .gitignore ├── .jshintrc ├── index.html ├── package.json ├── src │ ├── component │ │ ├── Root.jsx │ │ ├── Todo.jsx │ │ └── TodoList.jsx │ ├── css │ │ └── style.css │ └── main.js └── webpack.config.js └── 2-autoSuggest ├── index.html ├── index.js └── style.css /.idea/.name: -------------------------------------------------------------------------------- 1 | web-front-end-thinking-tutorial -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/web-front-end-thinking-tutorial.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/workspace.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | true 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 1460026157936 165 | 166 | 1460026157936 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # web-front-end-thinking-tutorial 2 | 3 | ## 前言 4 | ### 教学课程 5 | 见仓库 6 | 7 | ### 教学模式 8 | 课程采取线下教课模式;github 上看到的人,线上自学模式 9 | 10 | ### 教学作业和答案 11 | 将在 github 上 提交,标准答案在 ./practice/yuwei/ 路径下 12 | 13 | 14 | ## 总教学提纲 15 | ### 基础 16 | - 编程基础 17 | - 你有多喜欢编程 18 | - 你平均每天在编程上花多少时间 19 | - 除了看书、写代码,你的思考有多少 20 | - chrome dev tool:控制台调试、断点调试、性能检测 21 | - js 语法基础 22 | - string、array 常用方法 23 | - 闭包 24 | - this 25 | - 原型链、继承 26 | - js 事件队列 27 | - 回调函数的原理 28 | - es6 常用语法基础 29 | - 解构、let和const、扩展运算符 30 | - 箭头函数、Promise 对象 31 | - Module(重点) 32 | - dom 基础 33 | - DOM 增删改查 34 | - DOM 事件机制 35 | - css 基础(不讲) 36 | - git 基础(不讲) 37 | - web 性能优化基础 38 | - 看书了解原理:[《高性能网站建设指南》](http://book.douban.com/subject/3132277/) 39 | - 请求数量: 合并脚本和样式表, iconfont,拆分初始化负载,划分主域 40 | - 请求带宽: 开启 GZip,精简 JavaScript,移除重复脚本,图像优化 41 | - 缓存利用: 使用 CDN,使用外部 JavaScript 和 CSS,减少 DNS 查找 42 | - 页面结构: 将样式表(影响样式的内容)放在顶部,将脚本放在底部,尽早刷新文档的输出 43 | 44 | ### 实战 45 | > 1. 都是 纯前端项目、2人一组,通过 fork + PR 来在 github 上面提交 46 | > 2. 所有项目可以使用 boostrap、purecss 这种 css 样式库,自己就可以省掉写 css 的时间快速学习、开发。 47 | > 3. 完成基本功能就 ok,自由发挥为主(选择如何组织项目结构、选择使用的库,自己当自己的架构师) 48 | 49 | 50 | #### 小作业 51 | - 使用 DOM 写简版的搜索栏(功能和百度谷歌类似) 52 | - 模仿前端渲染框架工作原理(比如模仿 react)写个简版 TODO(可以选择使用 jquery) 53 | - 使用 react 写个简版 TODO 54 | 55 | #### 大作业 56 | - 使用 react react-router redux 写一个包括模拟登陆功能的简版 TODO 应用(假设用户不刷新,有能力的人可以使用 localstorage 来完成一个完整的 webapp) 57 | - 或者自己的点子,还是用 react react-router redux 的技术栈 58 | 59 | ### 框架、工具 60 | - 学会查文档 61 | - [MDN](https://developer.mozilla.org/zh-CN/docs/Web) 是 web 开发者学习的好地方,不需要刷,但是需要你想了解语法细节的时候,会查、肯看 62 | - mac 可以使用 dash 阅读 MDN 的文档 63 | - 其他平台可以使用在线文档 (http://devdocs.io/) 64 | - 学习框架类库最好的地方就是直接阅读 github README、看官方文档的 get start、github 仓库的 example、源码 65 | - github 66 | - fork 67 | - PR 68 | - webpack 69 | - 使用 es6 等预处理器 70 | - 开发(dev)环境和生产(production)环境 71 | - react 72 | - 基本概念 73 | - 基本使用 74 | - vitural DOM 75 | - react-router 76 | - 什么是前端路由 77 | - 以往的后端路由是怎么样的 78 | - 基本使用 79 | - redux 80 | - 基本概念 81 | - 基本使用 82 | - react-redux 83 | 84 | ## 推荐书籍 85 | - 《css 设计指南》 86 | - dom 入门书: 《js dom 编程艺术》 87 | - js 进阶小书:[《JavaScript语言精粹》](https://book.douban.com/subject/3590768/)、effective js、 you dont know js 88 | - js 系统厚书:《js 高级程序设计》、《js 权威指南》即犀牛书 89 | - 其他:[《高性能网站建设指南》](http://book.douban.com/subject/3132277/) 90 | 91 | ## 推荐在线学习资料 92 | - git 小白入门:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 93 | - github 博客: https://github.com/CoderUnion/coderunion-github-talk/issues/87 94 | - weibo:https://github.com/CoderUnion/coderunion-github-talk/issues/86 95 | 96 | ## 线上自学模式和捐赠 97 | 线上自学模式,我没有义务改你的作业(code review),不过你可以捐赠我(支付宝>10元),邮件联系我,并告诉我你 github id 即可,我就会 code review 你的每一行代码。 98 | -------------------------------------------------------------------------------- /practice/autoComplete.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimplyY/web-front-end-thinking-tutorial/d3b3710832ac167485740eface94043ba7785e55/practice/autoComplete.js -------------------------------------------------------------------------------- /practice/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
Search
15 | React.render( 16 | , 17 | document.getElementById('container') 18 | ); 19 |
21 | var HelloWorld = React.createClass({ 22 | render: function() { 23 | return ( 24 | Hello, {this.props.name} 25 | ); 26 | } 27 | }); //通过this.props.name就可以获取name属性值啦 28 |
<--!a href="http://facebook.github.io/react/"-->Hello!
React.createElement('a', {href: 'http://facebook.github.io/react/'}, 'Hello!')
render(ReactElement,元素 50 | DomElement,要被元素替换的容器 51 | [回调函数],这个是可选的,如果选择了,那么就在元素被渲染后开始执行 52 | ) 53 |
this.state = { inputStr: ''//设置新状态以便动态获取input里的值}
return item.toLowerCase().indexOf(inputStr.toLowerCase()) >= 0//将输入的字符串与数据字符串化为小写进行比较(避免了因为大小写的问题而导致没有匹配出来)//如果匹配后发现确实存在,那么就返回伪数据数组里这个字符串进tips
; 348 | }, 349 | handleClick: function(param, event) { 350 | // handle click 351 | } 352 | 353 | ##State 354 | 355 | React 里,只需更新组件的 state,然后根据新的 state 重新渲染用户界面(不要操作 DOM)。 356 | 357 | 常用的通知 React 数据变化的方法是调用 setState(data, callback)。这个方法会合并(merge) data 到 this.state,并重新渲染组件。渲染完成后,调用可选的 callback 回调。大部分情况下不需要提供 callback,因为 React 会负责把界面更新到最新状态。 358 | 359 | ###哪些组件应该有State? 360 | 361 | 大部分组件的工作应该是从 props 里取数据并渲染出来。但是,有时需要对用户输入、服务器请求或者时间变化等作出响应,这时才需要使用 State。 362 | 363 | **尝试把尽可能多的组件无状态化。** 这样做能隔离 state,把它放到最合理的地方,也能减少冗余,同时易于解释程序运作过程。 364 | 365 | 常用的模式是创建多个只负责渲染数据的无状态(stateless)组件,在它们的上层创建一个有状态(stateful)组件并把它的状态通过 props 传给子级。这个有状态的组件封装了所有用户的交互逻辑,而这些无状态组件则负责声明式地渲染数据。 366 | 367 | ###哪些不应该作为State? 368 | 369 | this.state 应该仅包括能表示用户界面状态所需的最少数据。因此,它不应该包括: 370 | 371 | - 计算所得数据:不要担心根据 state 来预先计算数据 —— 把所有的计算都放到 render() 里更容易保证用户界面和数据的一致性。 372 | 373 | 374 | > 例如,在 state 里有一个数组(listItems),我们要把数组长度渲染成字符串, 直接在 render() 里使用 this.state.listItems.length + ' list items' 比把它放到 state 里好的多。 375 | 376 | 377 | - React 组件: 在 render() 里使用当前 props 和 state 来创建它。 378 | - 基于 props 的重复数据: 尽可能使用 props 来作为惟一数据来源。把 props 保存到 state 的一个有效的场景是需要知道它以前值的时候,因为未来的 props 可能会变化。 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | -------------------------------------------------------------------------------- /practice/wuhuizhong/3/个人总结.md: -------------------------------------------------------------------------------- 1 | ##个人总结 2 | 3 | 笔记塞得东西太多,这个写的就是精简的个人理解 4 | 5 | - import 6 | 7 | 用于从别的文件中导入变量(?),对应使用export 8 | 9 | - bind 10 | 11 | 生成一个新的函数,并且不会立马调用。第一个参数也是绑定 this 的值,后面接受传递给函数的不定参数。 bind() 生成的新函数返回后,想什么时候调就什么时候调。 12 | 13 | - this.props 14 | 15 | 这个组件的输入被称为 props - "properties"的缩写。它们通过 JSX 语法进行参数传递。你必须知道,**在组件里这些属性是不可直接改变的**,也就是说 **this.props** 是**只读**的 16 | 17 | - this.states 18 | 19 | 放置需要动态调用的数据,类似一个状态机。React 里,只需更新组件的 state,然后根据新的 state 重新渲染用户界面(不要操作 DOM)。 20 | 21 | - this.setState 22 | 23 | 常用的通知 React 数据变化的方法是调用 setState(data, callback)。这个方法会合并(merge) data 到 this.state,并重新渲染组件。渲染完成后,调用可选的 callback 回调。大部分情况下不需要提供 callback,因为 React 会负责把界面更新到最新状态。 24 | 25 | - JSX 26 | 27 | 一个可以通过 JavaScript 直接生成模板,可选类似 HTML 语法 ,通过函数调用即可生成模板的编译器。 28 | 29 | - render 30 | 31 | React组件通过一个 render() 方法,接受输入的参数并返回展示的对象。 -------------------------------------------------------------------------------- /practice/yuwei/1/answer.js: -------------------------------------------------------------------------------- 1 | // 1.将数字字符串:'123'转化为数字:123: 2 | var str = '123'; 3 | var number = parseInt(str, 10); 4 | console.log(number); 5 | 6 | // 2.使用Number函数将数字字符串数组:['1','2']转化为数字数组:[1,2]: 7 | var array = ['1','2']; 8 | var numberArray = array.map(Number); 9 | console.log(numberArray); 10 | 11 | //3.将集合转化为真正的数组 12 | var childCollection = document.querySelectorAll('div'); 13 | var childs = Array.prototype.slice.call(childCollection); 14 | 15 | //4.写一个spacify函数,使得spacify('hello world'),返回'h e l l o w o r l d' 16 | function spacify(str){ 17 | var newStr = str.replace(/\s/g,'').split('').join(' '); 18 | console.log(newStr); 19 | return newStr; 20 | } 21 | spacify('hello world'); //'h e l l o w o r l d' 22 | 23 | //5.写一个函数,将英文字符串重新按照字母排序,比如cba,返回abc 24 | function sortStr(str){ 25 | var sortedStr = Array.prototype.slice.call(str).sort().join(''); 26 | console.log(sortedStr); 27 | return sortedStr; 28 | } 29 | sortStr('cbdae'); //abcde 30 | 31 | //6.var a = ['a', 'b', 'c', 'd'],每过1秒log一下数组中的值(闭包) 32 | function logEverySecond(){ 33 | var a = ['a', 'b', 'c', 'd']; 34 | for (var i = 0; i < a.length; i++) { 35 | (function(j){ 36 | setTimeout(function(){ 37 | console.log(a[j]); 38 | }, j * 1000); 39 | })(i); 40 | } 41 | } 42 | logEverySecond(); 43 | 44 | //7.定义log,然后它可以代理console.log的方法(使用apply) 45 | function log(){ 46 | console.log.apply(console, arguments); 47 | } 48 | log('sss'); 49 | 50 | //8.写出打印的输出(this指向) 51 | var User = { 52 | count: 1, 53 | 54 | getCount: function(){ 55 | return this.count; 56 | } 57 | }; 58 | 59 | console.log(User.getCount()); //1,this指向User,打印User.count 60 | 61 | var func = User.getCount; 62 | console.log(func()); //undefined 63 | -------------------------------------------------------------------------------- /practice/yuwei/2-autoSuggest/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |