zoukankan      html  css  js  c++  java
  • react笔记

    1.react 不使用模板  

    不是mvc框架   响应式  轻量级js库

    2虚拟Dom

    确保对界面上真正发生的部分进行实际的Dom操作,逐层次的来进行节点比较。

    3.react 环境搭建

    React  react-dom.js  babel.js   es6转es5 JSX转JavaScript

    下载 npm I react  - - save   npm I react-dom - - save    npm I babel-standalone –save

    4.jsx的语法

    注释必须  {/* 这是注释的内容  */}

    { } 花括号里面可以进行计算

    不能写class 因为这是javascript有的

    写className

    Map 循环有返回值,forEach循环没有返回值。

    遍历对象key值,Object.keys(obj) 返回一个数组  含对象所有key值的

    遍历对象的值  Object.keys(obj).map((I,v)=>{

                  return <p key={i}>遍历属性:{v}-------------遍历属性值{obj[v]}</p>

     })

    5.组件

    高耦合低内聚:高耦合就是把逻辑紧密的内容放到一个组件里面,低内聚:把不同组件的依赖关系尽量弱化,每个组件尽可能的独立。

    构建方式,组件属性 生命周期

    组件分为3部分: 属性props  状态state  生命周期

    组件名字必须以大写字母开头 可以写成单标签调用或者双标签调用

    Props只读

    组件无论是使用函数声明还是class声明,都不可更改props。

    分为无状态组件和类组件

    传值方法:           

      let obj={

                aa:"ll",

                bb:"89"

            }

    <Clock {...obj}/>  解析后相当于aa=ll,bb=89, 传值多的时候可以用扩展运算符

    或者 <Clock   aa=”123”  bb=””hfhffh/>

    如果没有传值,可以设置默认传值,Clock.defaultProps = {aa:”123” }

    Props 验证  验证传递过来的是否符合期望的类型或者要求,上线模式中取消props

    6.State和生命周期

    State是组件对内的接口,props是组件对外的接口

    自身需要管理的数据,对内管理的属性是state

    State是可变的,状态数据改变了,页面对应的绑定数据会自动进行改变。

    使用状态 不能使用无状态组件,要使用class声明的组件。

    State的用法: 写constructor 必须写super() 指向父类的构造函数  this.setState 是异步的,可以自动触发 render进行数据的渲染

    class Com extends React.Component {

                constructor(props) {

                    super(props)

                    this.state = {

                        aa: "123",

                    }

                }

                render() {

                    return (

                        <div>

                            <button onClick={() => { this.setState({ aa: 90 }) }}>gaibian</button>

                            <div>------{this.state.aa}</div>

                        </div>

                    )

                }

            }

            ReactDOM.render(

                <Com />,

                document.getElementById('demo')

            );

    如果想插入显示页面aa= <h1>123</h1>不能直接{this.State.aa} 应该<div dangerouslySetInner></div>

     dangerouslySetInnerHtml  是react 中innerHtml在浏览器Dom使用的替代品。

    onChange 事件的行为与你期望的一样,每当表单 字段发生更改的,将会触发事件。

    componentDidMount()方法会在组件已经被渲染到Domhou 运行,可以设置定时器。

    ComponentWillUnmount()生命周期中清除计时器,使用this.setState()来时刻更新state。

    不能直接修改State,用setState.state的更新可能是异步的。

    This.props和this.state可能会异步更新,所以不要依赖他们的值来更新下一个。

    State的更新可能会被合并

    7.事件处理

    React 事件的命名采用小驼峰式,不是纯小写。

    使用jsx语法需要传入一个函数作为事件处理函数,而不是一个字符串。

    React不能返回false的方式阻止默认行为。你必须显示的使用preventDefault。

    e.preventDefault();

    8.条件渲染&列表渲染

    条件渲染 : if、三目运算符、&&

     render() {
        //   三目运算符
        // return <div>
        //     {this.state.isLogin ? (<div>jkdsjfsdjkfjdsjgk</div>):(
        //     <div>
        //         mima:<input /> <br/>
        //         user:<input /> <br/>
        //         <button onClick={this.login}>denglu</button>
        //     </div>
        //   )}
        // </div>
    
        // && 
        return (
          <div>
            {this.state.isLogin && <div>jkdsjfsdjkfjdsjgk</div>}
            {!this.state.isLogin && (
              <div>
                mima:
                <input /> <br />
                user:
                <input /> <br />
                <button onClick={this.login}>denglu</button>
              </div>
            )}
          </div>
        );
    
        // 条件语句
        // if (this.state.isLogin) {
        //   return <div>jkdsjfsdjkfjdsjgk</div>;
        // } else {
        //     return <div>
        //         mima:<input /> <br/>
        //         user:<input /> <br/>
        //         <button onClick={this.login}>denglu</button>
        //     </div>;
        // }
      }

    列表渲染 数组map

    return (
          <div>
            <ul>
              {this.state.arr.map((item) => {
                return <li key={item.id}>{item.name}</li>;
              })}
            </ul>
          </div>
        );

    9.受控组件 & 非受控组件ref

     受控组件 即实现input的双向绑定

    import React from "react";

    class Test extends React.Component {
      constructor() {
        super();
        this.state = {
          userName: "",
          password: "",
        };
        this.inputRef = React.createRef(); //1.创建ref  将其赋值给一个变量,通过ref挂载在dom节点或组件上,该ref的current属性将能拿到dom节点或组件的实例
      }
     
      logintest = () => {
        console.log(this.state);
      };
     
      change = (e) => {
        // 属性名表达式
        this.setState({
          [e.target.name]: e.target.value,
        });
      };
     
      // dom节点挂载成功后
      componentDidMount() {
        this.inputRef.current.focus(); // 实现input自动获取焦点
      }
     
      render() {
        const { userName, password } = this.state;
     
        return (
          <div>
            user:
            <input
              ref={this.inputRef}  
              name="userName"
              value={userName}
              onChange={this.change}
              type="text"
            />
            <br />
            psd:
            <input
              name="password"
              value={password}
              onChange={this.change}
              type="text"
            />
            <br />
            <button onClick={this.logintest}>denglu</button>
          </div>
        );

        // 受控组件  双向绑定 state + onChange
      }
    }
    export default Test;

     10.父子组件传值

    父组件

    import React, { Component } from "react";
    import Son from "./Son";   //引入子组件
    
    class Parent extends Component {
        constructor(){
            super()
            this.state = {
                age:32,
                name:'jkkk'
            }
        }
      getValue = (data) => {   // 接收子组件传过来的值
        console.log(data);  // 打印传递 过来的数据
    }; 
    render() {
    return (
    <div>
        父组件
        <Son name={this.state.name} age={this.state.age} callback={this.getValue} /> // 父组件传值
    </div>

    );
    }
    }
    export
    default Parent;

     子组件:

    import React, { Component } from "react";
    
    class Son extends Component {
        toChuanzhi=()=>{                     // 子组件 -----> 父组件
            this.props.callback({            // 在callback里面传值给父组件
                name:'oooo',
                kkk:'kldkflds'
            })
        }
      render() {
        return (
          <div>
            zi组件
            <br />
             {this.props.name}-----{this.props.age}  // 接收父组件的值
             <button onClick={this.toChuanzhi}>点击传值给父组件</button>  
            <br />
          </div>
        );
      }
    }
    
    export default Son;

     11. react-router-dom 的使用

    列表一

    import React, { Component } from 'react'
    
    export default class GoodsList extends Component {
        render() {
            return (
                <div>
                    <ul>
                        <li>dfdsf</li>
                        <li>kdskfl</li>
                    </ul>
                </div>
            )
        }
    }

    列表二

    import React, { Component } from 'react'
    
    export default class FoodList extends Component {
        render() {
            return (
                <div>
                    <ul>
                        <li>1</li>
                        <li>12</li>
                        <li>123</li>
                    </ul>
                </div>
            )
        }
    }

    index.jsx

    import React, { Component } from "react";
    
    import { BrowserRouter as Router, Route, Link } from "react-router-dom";
    import GoodsList from "./GoodsList";
    import FoodList from "./FoodList";
    
    export default class index extends Component {
      render() {
        return (
          <div>
            <Router>
              <div>
                <Link to="/a">GoodsList</Link> &nbsp;&nbsp;
                <Link to="/b">FoodList</Link>
                <div>
                  <Route path="/a" component={GoodsList} />
                  <Route path="/b" component={FoodList} />
                </div>
              </div>
            </Router>
          </div>
        );
      }
    }

  • 相关阅读:
    自定义注解标签验证
    redis-服务器配置-主从
    POJ-2195 Going Home(最小费用最大流模板)
    POJ-1087 A Plug for UNIX
    HDU-3625 Examining the Rooms (第一类斯特林数)
    网络流入门
    CodeForces-1082G Increasing Frequency
    python学习之模块-模块(三)
    python学习之模块-模块(二)
    python学习之模块-模块(一)
  • 原文地址:https://www.cnblogs.com/lh1998/p/13692469.html
Copyright © 2011-2022 走看看