react.js基本使用

核心概念

虚拟dom

用js对象模拟页面上的元素,并提供操作dom对象的api,能够使页面高效刷新

解决问题?

传统的渲染方案

方案一:手动for循环整个数组,然后手动拼接字符串

方案二:使用模板引擎,art-template

当内存中的数据更新时(例如数组排列顺序发生改变),要求重新渲染,这就出现了性能问题

如何解决?按需渲染页面,程序员手动模拟新旧两颗dom树(内存变化前后),进行比较

 

diff算法

目的:实现高效对比

tree diff 新旧两颗dom树,逐层对比的过程,就是Tree Diff;当整颗dom树对比完毕,则就能找到按需更新的元素

component diff tree diff的过程中,每一层进行组件的对比 如果对比前后,组件类型相同,则暂时认为此组件不需要被更新 如果对比前后,组件类型不同,则移除旧组件,创建新组件,并追加到新组件上

element diff 在进行组件对比时,如果两个组件类型相同,则需要进行元素级别的比较

 

添加依赖

cnpm i react react-dom -S

  import React from 'react'
  import ReactDOM from 'react-dom'

 

如何使用

创建虚拟Dom元素
 

const myh1 = React.createElement('h1', { title: '啊,五环', id: 'myh1' }, '你比四环多一环')

<div id="app"></div>

渲染

ReactDOM.render(myh1, document.getElementById('app'))


// 参数1: 表示要渲染的虚拟DOM对象
// 参数2: 指定容器,注意:这里不能直接放 容器元素的Id字符串,需要放一个容器的DOM对象

 

组件

组件的构建

组件构建方式一:函数声明直接构建

function Hello () {
      // return null
      return <div>Hello 组件</div>
  }

组件构建方式二:使用class关键字

import React,{Component} from 'react'
import ReactDOM from 'react-dom'
class 组件名称 extends React.Component{
    construtor(){
        super()
        this.state = { msg:'大家好'}    //这里的数据都是可读可写的
    }
    render(){
        return <div>{this.props.name}<div>    //props是父组件传递过来的
    }
}
ReactDOM.render(){
}

 

单独抽离出.jsx文件

exprot default Hello

 

两种组件的区别

使用class关键字创建的组件(有状态组件)有自己的私有属性,无状态组件,前者有生命周期,后者运行效率高

 

组件的数据传递
 

<Hello name={dog.name} age={dog.age} gender={dog.gender}></Hello>

function Hello(props) {
    // props.name = 'zs'
    console.log(props)
    // 结论:不论是 Vue 还是 React,组件中的 props 永远都是只读的;不能被重新赋值;
    return <div>这是 Hello 组件 --- {props.name} --- {props.age} --- {props.gender}</div>}

 

组件的css

抽取

const itemStyle = { color: 'red'}
style={ itemStyle }   

 

外链

import cssobj from  './css/cmtlist.css'

 

模板技术

JSX

就是符合 xml 规范的 JS 语法 js代码必须用{}包裹
{ title }    { arr }

 

安装 `babel` 插件


 

- 运行`cnpm i babel-core babel-loader babel-plugin-transform-runtime -D`
- 运行`cnpm i babel-preset-env babel-preset-stage-0 -D`
+ 运行`cnpm i babel-preset-react -D`
rules: [
           { test: /\.js|jsx$/, use: 'babel-loader', exclude: /node_modules/ }
  ]

遍历

array.forEach(function(item,index,arr){
});     ++字符串    //或者push到数组中

{arrStr.map(item=>{
    return <h1>{item}</h1>
})}

组件间的区别可以看:https://www.w3cplus.com/react/stateful-vs-stateless-components.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值