React - 1

阅读 45

2022-02-14

一、React入门

一、React简介

1. 用于构建用户界面的JavaScript库。是一个将数据渲染为HTML视图的开源JavaScript库

2. react高效的原因:

  • 使用虚拟DOM 不总是直接操作页面真实DOM
  • DOM Diffing算法,最小化页面重绘

二、基本使用

1. 相关js库

  • react.js:React核心库
  • react-dom.js:提供操作DOM的react扩展库
  • babel.min.js:解析JSX愈发代码转为JS代码的库

2. 虚拟DOM与真实DOM:

  • 虚拟DOM本质是object类型的对象
  • 虚拟DOM属性少,真实DOM属性多,因为虚拟DOM是react内部再用,无需真实DOM上那么多的属性
  • 虚拟DOM最终会被React转化为真实DOM呈现在页面上

三、React JSX

全称JavaScript XML

1. 定义虚拟DOM时不要写引号

2. 标签中混入JS表达式时要用{}

3. 样式的类名指定不要用class要用className

4. 行内样式要用 style = {{fontSize:20px, }}的形式写

5. 虚拟DOM必须只有一个根标签

6. 标签必须闭合

7. 标签首字母

  • 若小写字母开头则将该标签转为html中同名元素,若html中无改标签对应的同名元素则报错
  • 若大写字母开头 react就去渲染对应的组件,若组件没有定义则报错

四、组件与模块

1. 模块

  • 一般就是一个js文件
  • 复用ks,简化js编写,提高js运行效率

2. 组件

  • 用来实现局部功能效果的代码和资源的集合(html/css/js/image等)
  • 复用编码,简化项目编码,提高运行效率

3. 模块化

当应用的js都以模块来编写的,这个应用就是一个模块化的应用

4. 组件化

当应用是以多组件的方式实现,这个应用就是一个组件化的应用

二、React面向组件编程

一、基本理解和使用

1. 组件

  • 组件名必须首字母大写

2. 执行ReactDOM.render(<Demo/>, document.getElementById('test'))之后

  • React解析组件标签 找到Demo组件
  • 发现组件是使用函数定义的,随后调用该函数,将返回的虚拟DOM转为真实DOM呈现在页面中

P10 类的复习

  • 类中的构造器不是必须写的,要对实例进行一些初始化的操作如添加指定属性时才写
  • 如果A类继承了B类且A类中写了构造器,那么A类构造器中的super是必须调用的
  • 类中定义的方法都放在了累的原型对象上供实例使用

二、组件实例三大核心属性1: state

1. 理解

  • state是组件对象最重要的属性,值是对象(可以包含多个key-value的组合)
  • 组件被称为“状态机”,通过更新组件的state来更新对应的额页面显示(重新渲染组件)

组件的状态state存储数据,数据的改变驱动页面展示

  • 构造器:初始化状态;解决this指向问题
  • render:从状态里读东西 根据状态值做展示

!!!注意!!!

(1)组件中render方法中的this为组件实例对象

(2)组件自定义方法中this为undefined,解决办法:

  • 强制绑定this:通过函数对象的bind()
  • 箭头函数

(3)状态数据不能直接修改或更新

三、组件实例三大核心属性2: props

1. 理解

  • 每个组件对象都会有props属性
  • 组件标签的多有属性都保存在props中

2. 作用

  • 通过标签属性从组件外向组件内传递变化的数据
  • 注:组件内不要修改props数据

3. 编码操作

(1)使用propTypes库进行限制

        Person.propTypes = {
            //一下代码主义大小写!!!!!含义不同
            name: PropTypes.string.isRequired, //限制name必须传 且为字符串
            sex: PropTypes.string,
            age: PropTypes.number,
            speak: PropTypes.func, //限制函数不是function 只能是func
        }
        // 指定默认标签属性值
        Person.defaultProps = {
            sex: '男',
            age: 18
        }

 (2)扩展属性:可以批量传递,将对象的所有属性通过props传递

ReactDOM.render(<Person {...p} />, document.getElementById('test3'))
        //这里的{}不是触发了复制对象 只不过react加babel允许这样展开对象
        // 仅适用于标签属性传递

(3)默认属性值

        Person.defaultProps = {
            sex: '男',
            age: 18
        }

(4)组件类的构造函数

constructor(props){
    super(props)
    console.log(props)
}
  • 构造器是否接收props,是否传递给super取决于是否希望在构造器中通过this访问props
  • 类式组件一般不用构造器 能省略就省略

四、组件实例三大核心属性3: ref与事件处理

1. 理解

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

2. 编码

(1)字符串形式

<input ref = "input1" />

<input ref="input2" onBlur={this.showData2} type="text" placeholder="失去焦点提示数据"/>

            showData = () =>{
                const {input2} = this.refs //结构赋值 这是真实DOM
                alert(input2.value)
            }

(2)回调形式的ref

//把节点currentNode放在了自身实例上(this) 起了名字叫input1 
//this往外找找到render render的this就是组件的实例对象
//把ref当前所处的节点(外面的input)挂在了实例自身上并取名字叫input1
<input ref={(currentNode)=>{this.input1 = currentNode}} type="text" />


showData = () => {
    const{input1} = this
    alert(input1.value)
}

(3)createRef创建ref容器

class Demo extends React.Component {
    myRef = React.createRef()
    //React.createRef()调用后可以返回一个容器,该容器可以存储被ref所表示的节点
    //该容器是专人专用的 后进去的会顶替之前进的
        showData = () =>{
        alert(this.myRef.current.value);
        }

    render() {
        return (
            <div>
                <input ref={this.myRef} type="text" placeholder="点击按钮提示"/>
                <button ref="button100" onClick={this.showData}>点我提示左侧的数据</button>
            </div>
        }
}

不要过度使用Ref 发生事件的元素正好是操作的元素可以省略Ref

3. 事件处理

(1)通过onXxx属性指定事件处理函数(注意大小写)

  • React使用的是自定义(合成)事件, 而不是使用的原生DOM事件 ——为了更好的兼容性
  • React中的事件是通过事件委托方式处理的(委托给组件最外层的元素) —— 为了高效

(2)通过event.target得到发生事件的DOM元素对象 —— 不要过度使用ref

五、收集表单数据(好难啊)

1. 受控组件

随着输入维护状态 onChange

2. 非受控组件

现用现取

精彩评论(0)

0 0 举报