9.7 REACT

183 阅读3分钟

1. 引入文件

  • 固定顺序
    <script src="../文件/react.development.js"></script>
    <script src="../文件/react-dom.development.js"></script>
    <script src="../文件/browser.min.js"></script>
    //browser编译jsx语法
    //JSX当中的表达式要包含在大括号里
    <script type="text/babel">
        //code
    </script>

2. render

render方法有两个参数 第一个参数是要插入的内容,第二个是挂载元素 jsx 表达式要使用{}

    ReactDOM.render(
        <h1> hello world </h1>,
        document.getElementById('app')
    ) 

3. 模块化

  • 模块 向外提供特定功能的js程序,一般就是一个js文件作用:复用js,简化js的编写,提高js运行效率
  • 组件 用来实现特定(局域)功能效果的代码集合(html/css/js)作用:复用编码,简化项目编码,提高运行效率
  • 模块化 当应用的js都以模块来编写的,这个应用就是一个模块化的应用组件化 当应用是一多组件的方式实现,这个应用就是一个组件化的应用

4. 组件

  • 组件特点:可组合(Composeable)、可重用(Reusable)、可维护(Maintainable)
  • 优点:提高代码复用率、降低测试难度、降低代码复杂度
  • 函数式
  • 无状态
    const Welcome = () => {
        return <h1>hello world</h1>
    }
    ReactDOM.render(
        <Welcome></Welcome>,
        document.getElementById('app')
    ) 
  • class定义一个组件
  • 有状态
  • 有生命周期
    class Com extends React.Component{
        render(){
            return(
                <h1>hello world</h1>
            )
        }
    }
    ReactDOM.render(
        <Com></Com>,
        document.getElementById('app')
    ) 

5. 父子组件传值

  • 函数式只能接受参数+展示
  • class可接收参数并修改
  • props父传值不能改变,state可以实现交互
  1. 函数传参
    const Com = (props) => {
        return (
            <div>
                <span>{props.name}</span>//指向父元素传递内容
            </div>
        )
    }
    ReactDOM.render(
        <Com name="1234567"></Com>,
        document.getElementById('app')
    ) 
  1. class传参
    class Com extends React.Component{
        render(){
            return(
                <h1>{this.props.name}</h1>//this指向实例化对象
            )
        }
    }
    ReactDOM.render(
        <Com name="1234567"></Com>,
        document.getElementById('app')
    ) 
  1. 组件中slot
    class Com extends React.Component{
        render(){
            return(
                <h1>{this.props.name}</h1>
                {this.props.children}
            )
        }
    }
    ReactDOM.render(
        <Com name="1234567">
            <p>1234</p>
        </Com>,
        document.getElementById('app')
    ) 

6. state

  • state是组件对象最重要的属性,值是对象(可以包含多个数据),用于改变组件内通状态的值(动态的)

1. 初始化状态

    class InputTpl extends React.Component{
      constructor(params){
        super(params)
        this.state = {
            count:1
        }
      }
    }

2. 读取某个状态值

    this.state.count

3. 更新状态->组件界面更新

  • 组件更新使用setState
  • 不可直接修改,深拷贝后赋值
    add(value){
        let todo = [...this.state.todo]
        todo.push({
          name:value,
          isA:false,
          id:new Date().getTime()
        })
        this.setState({
          todo,
          list:todo
        })
      }

4. this

  • 自定义函数内部无法拿到this,需要在构造函数中bind
    constructor(params){
        super(params)
        this.change = this.change.bind(this)
     }

7. props VS state

  • props是不可变的,而state可以根据与用户交互来改变
  • props用于组件通信进行传值
  • state用于改变组件内容状态的值(动态的)

8. refs

  • 组件内的标签都可以定义ref属性来标识自己

1. ref

    <input type="text" ref={input => this.myInput = input}/>
  • 得到对应的真实DOM元素
    console.log(this.myInput.value)

2. refs

    <input type="text" ref="name"/>
  • 得到对应的真实DOM元素
    console.log(this.refs.name.value)

推荐方法一

9. 双向数据绑定

  • 使用event.target事件对象来更新react中的数据状态
  • 给输入框添加onChange事件(js驼峰式)
    <input type="text"  onChange={this.handleChange} />
    <p>{this.state.username}</p>
    
    handleChange = (event) => {
        this.setState({
            username: event.target.value
        })
    }
    // 初始化数据
    this.state = {
        form: {
           invite: '',
           nickname: '',
           username: '',
           password: ''
        },
    }
    // 给输入框绑定事件
    <input type="text" onChange={this.handleChange.bind(this, 'invite')}/>
    <input type="text" onChange={this.handleChange.bind(this, 'nickname')}/>
    <input type="text" onChange={this.handleChange.bind(this, 'username')}/>
    <input type="text" onChange={this.handleChange.bind(this, 'password')}/>
    // 编写事件方法
    handleChange = (key, event) => {
        let form = this.state.form
            for (let item in this.state.form) {
                if (item === key) {
                    form[item] = event.target.value
                    this.setState({form: form})
            }
        }
     }

10. 生命周期

1. initialization 组件初始化

  • 获取数据
  • constructor()

2. componetWillMount 组件即将渲染

3. render 组件渲染

4. componetDidMoun 组件渲染完成

5. componentWillReceiveProps(nextProps) props是否改变

  • props引起的组件更新过程

6. shouldComponentUpdate(nextProps, nextState) 组件是否更新

7. componentWillUpdate(nextProps, nextState) 组建即将更新

8. render 组件更新

9. componentDidUpdate(prevProps, prevState) 组件更新完成

10. componentWillUnmount 即将卸载