类的定义

ES5 语法

  1. // 注意不能用箭头函数,箭头函数没有this
  2. function Person (name, age) {
  3. this.name = name
  4. this.age = age
  5. }
  6. Person.prototype.sayHi = function() {
  7. console.log(`hello ${this.name}`)
  8. }
  9. const p = new Person('jack', 18)
  10. p.sayHi()

ES6 语法

  1. class Person {
  2. constructor(name, age){
  3. this.name = name
  4. this.age = age
  5. }
  6. sayHi(){
  7. console.log(`hello ${this.name}`)
  8. }
  9. }
  10. const p = new Person('jack', 18)
  11. p.sayHi()

this 问题

  1. const p = new Person('jack', 18)
  2. p.sayHi() // 隐式绑定了this
  3. let fn = p.sayHi
  4. // fn() // 报错
  5. const obj = {
  6. name: 'rose'
  7. }
  8. // 方法一: call或apply
  9. fn.call(obj) // rose
  10. // 方法二: bind
  11. fn = fn.bind(obj)
  12. fn()

继承

减少重复代码

  1. class Person {
  2. constructor(name, age){
  3. this.name = name
  4. this.age = age
  5. }
  6. sayHi(){
  7. console.log(`hello ${this.name}`)
  8. }
  9. }
  10. class Student extends Person {
  11. constructor(name, age, grade) {
  12. super(name,age) // constructor 必须调用父类
  13. // this.age = 111 可以重写属性
  14. this.grade = grade
  15. }
  16. study() {
  17. console.log('good good study')
  18. }
  19. }
  20. const lilei = new Student('lilei',18, 2)
  21. console.log(lilei.age)
  22. lilei.sayHi()

VSCode创建snippets

在VSCode中创建模板代码
使用 snippet generator 生成模板代码
复制粘贴到 File -> Preferences -> User Snippets

JSX案例: 打印电影列表

使用 for 循环

使用 for-in 遍历数组,得到的是 index
使用 for-of 遍历数组,得到的是 value

  1. class App extends React.Component {
  2. constructor(){
  3. super()
  4. this.state = {
  5. movies: ['蜘蛛侠', '变形金刚', '奇异博士', '功夫']
  6. }
  7. }
  8. render(){
  9. let movieList = []
  10. for (let i of this.state.movies) {
  11. movieList.push(<li>{i}</li>) // 注意数组里的不是字符串,而是JSX
  12. }
  13. return (
  14. <div>
  15. <h1>电影列表</h1>
  16. <ul>
  17. {movieList}
  18. </ul>
  19. </div>
  20. )
  21. }
  22. }

使用 map 函数

map函数接受2个参数

  • 回调函数:(item, index, array) => { }
  • 给回调函数绑定的 this

    1. class App extends React.Component {
    2. constructor(){
    3. super()
    4. this.state = {
    5. movies: ['蜘蛛侠', '变形金刚', '奇异博士', '功夫']
    6. }
    7. }
    8. render() {
    9. return (
    10. <div>
    11. <h1>电影列表</h1>
    12. <ul>
    13. {this.state.movies.map(item => <li key={item}>{item}</li>)}
    14. </ul>
    15. </div>
    16. )
    17. }
    18. }

    JSX案例:计数器

    setState 是从 React.Component 继承的
    事件处理方法是React内部在调用,需要指定this, 否则为undefined

    1. class App extends React.Component {
    2. constructor(){
    3. super()
    4. this.state = {
    5. count: 0
    6. }
    7. }
    8. render(){
    9. return (
    10. <div>
    11. <h2>当前计数: {this.state.count}</h2>
    12. <button onClick={this.increment.bind(this)}>+1</button>
    13. <button onClick={this.decrement.bind(this)}>-1</button>
    14. </div>
    15. )
    16. }
    17. increment() {
    18. this.setState({
    19. count: this.state.count + 1
    20. })
    21. }
    22. decrement() {
    23. this.setState({
    24. count: this.state.count - 1
    25. })
    26. }
    27. }

    JSX语法

  • JSX是JavaScript语法扩展(JavaScript XML)

  • 用于描述UI界面,与JavaScript融合
    1. const element = <h1>Hello world</h1>

    JSX中的注释写法

    ```jsx {/ 这是注释正确写法 /}

{// 不能写成这样,后面的括号会被注释掉导致报错 }

  1. <a name="AeABm"></a>
  2. #### JSX 中显示数据类型和表达式
  3. ```jsx
  4. class App extends React.Component {
  5. constructor(){
  6. super()
  7. this.state = {
  8. name: 'jack',
  9. age: 18,
  10. arr: ['a', 'b', 'c'],
  11. flag: true,
  12. n: null,
  13. u: undefined,
  14. obj: {
  15. name: 'jack',
  16. age: 18
  17. }
  18. }
  19. }
  20. render(){
  21. return (
  22. <div>
  23. {/* string, number, array 可以正常显示 */}
  24. {this.state.name}
  25. {this.state.age}
  26. {this.state.arr}
  27. {/* boolean, null, undefined 被忽略 */}
  28. {this.state.flag}
  29. {this.state.n}
  30. {this.state.u}
  31. {/* 将boolean, null, undefined 转化为字符串可显示 */}
  32. {this.state.flag.toString()}
  33. {this.state.n + ""}
  34. {this.state.u + ""}
  35. {/* 对象不能作为JSX的子项 */}
  36. {/* this.state.obj */}
  37. {/* 表达式 */}
  38. {this.state.flag ? <h2>hello</h2> : null}
  39. {this.state.flag && <h2>hello</h2>}
  40. {this.getInfo()}
  41. </div>
  42. )
  43. }
  44. getInfo(){
  45. return (<div>{this.state.name}</div>)
  46. }
  47. }