console.log

老鸟使用 console.log的次数是菜鸟的数十倍甚至数百倍。

Protip: Visual Studio Code snippets

使用 Visual Studio Code能够很容易创建“代码片段(snippets)” ,即快速生成常用代码块
常用的输入log后敲Tab键则自动补全console.log()

JavaScript Arrays

从现在开始,我们将一直使用 JavaScript 数组的函数式编程方法,比如 find, filter, 和 map。
如果使用数组的函数式编程对你来说感觉很陌生,那么至少可以看看 YouTube 视频系列的前三部分 Functional Programming in JavaScript

  • 高阶函数
  • Map
  • Reduce 基础

    Rendering Collections 渲染集合

    index.js
    notes声明为全局变量 ```javascript import ReactDOM from ‘react-dom’; import App from ‘./App’;

const notes = [ { id: 1, content: ‘HTML is easy’, date: ‘2019-05-30T17:30:31.098Z’, important: true }, { id: 2, content: ‘Browser can execute only JavaScript’, date: ‘2019-05-30T18:39:34.091Z’, important: false }, { id: 3, content: ‘GET and POST are the most important methods of HTTP protocol’, date: ‘2019-05-30T19:20:14.298Z’, important: true } ]

ReactDOM.render( , document.getElementById(‘root’) );

  1. App.js<br />使用**map**遍历数组,返回`**li**`元素<br />箭头函数可分多行,提高代码可读性
  2. ```javascript
  3. import React from 'react'
  4. const App = (props) => {
  5. const { notes } = props
  6. return (
  7. <div>
  8. <h1>Notes</h1>
  9. <ul>
  10. {notes.map(note =>
  11. <li>
  12. {note.content}
  13. </li>
  14. )}
  15. </ul>
  16. </div>
  17. )
  18. }
  19. export default App;

Key-attribute key属性

image.png
控制台会有提示,list的每个子元素都应该有个key。
map 方法生成的每个元素,都必须有一个唯一的键值: 一个名为key 的属性。
给li添加key:

  1. {notes.map(note =>
  2. <li key={note.id}>
  3. {note.content}
  4. </li>
  5. )}

Anti-pattern: Array Indexes as Keys 反模式-数组索引作为key

map方法的回调函数的第二个参数i是数组索引
因此可以将索引作为li的key

  1. notes.map((note, i) => ...)

但这种方法是不推荐的,因为可能导致意想不到的问题

Refactoring modules 重构模块

注意,这里是给Note组件添加key,而不是给li添加key

  1. const Note = ({ note }) => {
  2. return (
  3. <li>{note.content}</li>
  4. )
  5. }
  6. const App = ({ notes }) => {
  7. return (
  8. <div>
  9. <h1>Notes</h1>
  10. <ul>
  11. {notes.map(note =>
  12. <Note key={note.id} note={note} />
  13. )}
  14. </ul>
  15. </div>
  16. )
  17. }

将Note组件放在单独的module中

在src目录新建components目录,在components目录新建Note.js文件

  1. import React from 'react'
  2. const Note = ({ note }) => {
  3. return (
  4. <li>{note.content}</li>
  5. )
  6. }
  7. export default Note

由于这是一个 React-组件,因此我们必须导入 React
接下来在App组件中import Note, 使用相对路径,文件扩展名(.js)可以省略

  1. import Note from './components/Note'

When the Application Breaks

当应用崩掉了怎么办?
最好的方案就是 console.log。
通过在代码不同的位置添加console.log,来寻找和排除可能出错的地方

exercise 2.1 - 2.5

复习reduce

语法

  1. let value = arr.reduce(function(accumulator, item, index, array) {
  2. // ...
  3. }, [initial]);
  • accumulator —— 是上一个函数调用的结果,第一次等于 initial(如果提供了 initial 的话)。
  • item —— 当前的数组元素。
  • index —— 当前索引。
  • arr —— 数组本身。

应用函数时,上一个函数调用的结果将作为第一个参数传递给下一个函数。
因此,第一个参数本质上是累加器,用于存储所有先前执行的组合结果。最后,它成为 reduce 的结果。
如果没有初始值,那么 reduce 会将数组的第一个元素作为初始值,并从第二个元素开始迭代。
示例:

  1. let arr = [1, 2, 3, 4, 5];
  2. let result = arr.reduce((sum, current) => sum + current, 0);
  3. alert(result); // 15

course项目中使用map和reduce

  1. import React from 'react'
  2. const Course = ({ course }) => {
  3. const total = course.parts.reduce((sum, item) => sum + item.exercises, 0)
  4. return (
  5. <>
  6. <h1>{course.name}</h1>
  7. {course.parts.map(item => <div key={item.id}>{item.name} {item.exercises}</div>)}
  8. <h3>total of {total} exercises</h3>
  9. </>
  10. )
  11. }
  12. const App = () => {
  13. const course = {
  14. id: 1,
  15. name: 'Half Stack application development',
  16. parts: [
  17. {
  18. name: 'Fundamentals of React',
  19. exercises: 10,
  20. id: 1
  21. },
  22. {
  23. name: 'Using props to pass data',
  24. exercises: 7,
  25. id: 2
  26. },
  27. {
  28. name: 'State of a component',
  29. exercises: 14,
  30. id: 3
  31. }
  32. ]
  33. }
  34. return <Course course={course} />
  35. }
  36. export default App

让App支持更多课程

  1. const App = () => {
  2. const courses = [
  3. {
  4. name: 'Half Stack application development',
  5. id: 1,
  6. parts: [
  7. {
  8. name: 'Fundamentals of React',
  9. exercises: 10,
  10. id: 1
  11. },
  12. {
  13. name: 'Using props to pass data',
  14. exercises: 7,
  15. id: 2
  16. },
  17. {
  18. name: 'State of a component',
  19. exercises: 14,
  20. id: 3
  21. },
  22. {
  23. name: 'Redux',
  24. exercises: 11,
  25. id: 4
  26. }
  27. ]
  28. },
  29. {
  30. name: 'Node.js',
  31. id: 2,
  32. parts: [
  33. {
  34. name: 'Routing',
  35. exercises: 3,
  36. id: 1
  37. },
  38. {
  39. name: 'Middlewares',
  40. exercises: 7,
  41. id: 2
  42. }
  43. ]
  44. }
  45. ]
  46. return <>{courses.map(item => <Course key={item.id} course={item} />)}</>
  47. }