• react创建项目学习基础语法(二)


    import React, { Component } from 'react'
    import logo from './logo.svg';
    import './App.css';
    import axios from 'axios' // react 使用 axios
    
    // 本页面只做基础的 react 常用语法糖
    export default class App extends Component {
      constructor(props, context) {
        super(props, context);
        this.state = {
          name: '波波',
          age: 20,
          date: new Date(),
          isShow: false,
          list: [{id: 1, name: 'react'}, {id: 2, name: 'vue'}],
          value: ''
        }
      }
      // componentWillMount和componentDidMount这两个生命周期函数,只在页面刷新时执行一次,而render函数是只要有state和props变化就会执行
      //  React16新的生命周期弃用了componentWillMount、componentWillReceivePorps,componentWillUpdate
      // 新增了getDerivedStateFromProps、getSnapshotBeforeUpdate来代替弃用的三个钩子函数(componentWillMount、componentWillReceivePorps,componentWillUpdate)
      // React16并没有删除这三个钩子函数,但是不能和新增的钩子函数 17版本将会删除(componentWillMount、componentWillReceivePorps,componentWillUpdate)
      componentWillMount(){
        console.log('componentWillMount----组件将要挂载到页面---1')
      }
      
      // 建议在componentDidMount函数里作ajax请求
      componentDidMount() {
        this.timer = setInterval(() => {
          this.setState({
            date: new Date()
          })
        }, 1000);
        console.log('componentDidMount---组件挂载完毕-----3')
        // 在node_modules文件下找到react_script文件夹,代开scripts文件下,找到 starts.js文件 修改默认的3000端口
        // 在package.json 文件 中 配置 "proxy": "http://xxxx/" 代理地址(后端服务器地址) 解决跨域(三种常见方式)
        // webpack 里面配置 devServer 再配置 proxy 或者 使用 http-proxy-middleware 中间件处理
        axios.post('/xxx/list').then(
          res => {
          console.log('axios 获取数据成功:'+ JSON.stringify(res))  
          const resdata = res.data.returnData;
          this.setState({
            list: resdata // 动态数据
          })
        }).catch(
          error => {console.log('axios 获取数据失败' + error)
        })
      }
    
      // nextProps:变化后的属性;
      // nextState:变化后的状态  
      shouldComponentUpdate(nextProps,nextState){
        console.log('shouldComponentUpdate---组件发生改变前执行--它要求返回一个布尔类型的结果,必须有返回值,这里就直接返回一个true了(真实开发中,视情况而定做相关处理)---4')
        // if(nextProps.content !== this.props.content){
        //   return true
        // }else{
        //   return false
        // }
        return true
      }
    
      //shouldComponentUpdate返回true才会被执行。
      componentWillUpdate(){
        console.log('componentWillUpdate---组件更新前,shouldComponentUpdate函数之后执行-------5')
      }
    
      // 简单的说就是 触发了第二次render之后执行
      componentDidUpdate(){
        console.log('componentDidUpdate----组件更新之后执行----6')
      }
    
      // 这时候会发现函数什么时候都不会被执行 凡是组件都有生命周期函数,所以子组件也是有的,并且子组件接收了props,这时候函数就可以被执行了(把这个挪到子组件测试)
      // 子组件接收到父组件传递过来的参数,父组件render函数重新被执行,这个生命周期就会被执行。
      // 也就是说这个组件第一次存在于Dom中,函数是不会被执行的;
      // 如果已经存在于Dom中,函数才会被执行。
      componentWillReceiveProps(){
        console.log('componentWillReceiveProps-----子组件接收props调用触发')
      }
    
      componentWillUnmount(){
        clearInterval(this.timer)
        console.log('componentWillUnmount---组件卸载')
      }
    
      // 渲染函数 
      render() {
        console.log('render---组件挂载中---2')
        const { age, isShow } = this.state;
        // console.log( age, isShow);
        return (
          <div className="wrap-box">
            {/* 属性 xx={} 形式使用 
            类名 classsName 添加  
            组件名称必须以大写字母开头
            React 会将以小写字母开头的组件视为原生 DOM 标签 
            所有 React 组件都必须像纯函数一样保护它们的 props 不被更改 
            不要直接修改 State
            自上而下”或是“单向”的数据流
            class 的方法默认不会绑定 this 方法调用需要bind(this) 或者使用 箭头函数
            true && expression 总是会返回 expression, 而 false && expression 总是会返回 false
            阻止组件渲染  render 方法直接返回 null,而不进行任何渲染 在组件的 render 方法中返回 null 并不会影响组件的生命周期
            key 只是在兄弟节点之间必须唯一 在 map() 方法中的元素需要设置 key 属性
            如果你不希望最外层用div包裹着 可以使用 Fragment 标签 (例如使用 flex写样式时候)
            */}
            <p>直接使用setState里面的值---{this.state.name}</p>
            <p>ES6解构使用setState里面的值---{age}</p>
            <p>时间方法:{this.state.date.toLocaleTimeString()}</p>
            <p>判断条件渲染----{isShow ? 'ture显示左边' : 'false显示右边'}</p>
            <img src={logo} className="App-logo" alt="logo" />
            <ul>
              {
               this.state.list.map((item,index) => {
                  return (
                    <li key={item.id.toString()}>
                      {item.name}---{index}
                    </li>
                  )}
                )
              }
            </ul>
            {/* 表单提交 */}
            <form onSubmit={this.handleSubmit}>
              <label>
                名字:
                <input type="text" value={this.state.value} onChange={this.handleChange} />
              </label>
              <input type="submit" value="提交" />
            </form>
            <button onClick={this.handleClick.bind(this)}> Click me </button>
            <button onClick={this.handleClick1}> Click me </button>
          </div>
        )
      }
    
      // 各类方法
      handleClick() {
        alert('方式1')
        // 如果不绑定 this 则打印出 this 为 undefined
        console.log('this is:', this);
      }
    
      handleClick1 = () => {
        alert('方式2')
        //箭头函数自动绑定this
        console.log('this is:', this);
      }
      // 绑定输入框值
      handleChange = (event) => {
        this.setState({value: event.target.value});
      }
      // 提交
      handleSubmit = (event) => {
        alert('提交的名字: ' + this.state.value);
        event.preventDefault();
      }
    }
    
    // function App() {
    //   return (
    //     <div className="App">
    //       <header className="App-header">
    //         <img src={logo} className="App-logo" alt="logo" />
    //         <p>
    //           Edit <code>src/App.js</code> and save to reload.
    //         </p>
    //         <a
    //           className="App-link"
    //           href="https://reactjs.org"
    //           target="_blank"
    //           rel="noopener noreferrer"
    //         >
    //           Learn React
    //         </a>
    //       </header>
    //     </div>
    //   );
    // }
    
    // export default App;

    以上为react最简单基础的语法糖;更多参照官方网站自己另外拓展中~以上用APP组件作为测试组件;

  • 相关阅读:
    oj1089-1096总结(输入输出练习)
    oj 1002题 (大数题)
    第五次博客园作业+
    第五次博客园作业-
    博客园第四次作业
    博客园第四次作业
    C语言第三次作业
    c语言第三次作业
    设计模式第一次作业
    项目选题报告(团队)
  • 原文地址:https://www.cnblogs.com/lhl66/p/12461508.html
Copyright © 2020-2023  润新知