React 是一个用于构建用户页面的JavaScript库,专注于视图,实现组件化开发。
组件化概念
将一个复杂的页面分成若干个独立的组件,每个组件都包含自己的逻辑和样式,在将这些组件组合成一个完整的页面。这样的操作即减少了逻辑复杂度又实现了代码的重用。
create-react-app
npm install create-react-app myApp
//mac 安装需要加 sudo
sudo npm install create-react-app myApp
import React from "react";
import {render} from "react-dom";
let name = "哈哈";
let ele =(
<>
你好{name}
嘻嘻
>
)
render(ele,window.root);
一般采用import的方式引入React,React首字母规定大些,因为jsx会默认使用大写的React
你好"}}>
你好
=>React.createElement('h1',{a:1}没有属性null,子元素)
react渲染的流程
let React = {
createElement(type,props,...children){//可以组成一个对象,用来描述dom元素
return {type,props,children};//虚拟dom
}
}
let ele = 哈哈
;
console.log(ele);//返回一个对象
let render=(obj,container)=>{
if(typeof obj === "string") return container.appenChild(document.createTextNode(obj));
let {type,props,children} = obj;
let ele = document.createElement(type);
for(let key in props){
ele.setAtteributte(key,props[key])
}
children.forEach(item=>{
render(item,ele);//递归,渲染子节点
})
children.appendChild(ele);
}
import React from "react";
import ReactDOM from "react-dom";
ReactDOM.render({JSON.stringify({a:1})},window.root);
函数组件
函数组件的不足
import React from "react";
import ReactDOM from "react-dom";
class Clcok extends React.Component{
render(){
return 哈哈
}
}
import React from "react";
import ReactDOM from "react-dom";
class Clcok extends React.Component{
constructor(props){//会接受组件传入的属性or方法
super(props);
//this.state 是规定死的,表示给这个组件生命状态
this.state={ }
}
//es7语法 简单粗暴 和上面的一样
// state={}
render(){
return 哈哈
}
}
this.setState
//用法
ReactDOM.unmountComponentAtNode(window.root)
componentDidMount(){
this.itemer = setInterval=()=>{
//this.setState 可以导致页面刷新
this.setState({time:new Date().toLocalString()})
}
}
componetWillUnmount(){
clearInterval(this.timer);
}
this问题
btnclick(){}
如果解决this指向问题
consttuctor(){
super();
this.btnclick = this.btnclick.bind(this); //这样每次点击的时候都是用的一个函数。
}
btnclick=()=>{} //这里采用箭头函数方式
React 内置了类型检测的功能,在组件中检测,可以赋值propTypes属性
import React from 'react';
import ReactDOM from 'react-dom';
import PropTypes from 'prop-types';
class Person extends React.Component{
static defaultProps = {
name:'Stranger'
}
static propTypes={
name: PropTypes.string.isRequired,
age: PropTypes.number.isRequired,
gender: PropTypes.oneOf(['male','famale']),
hobby: PropTypes.array,
postion: PropTypes.shape({
x: PropTypes.number,
y:PropTypes.number
}),
age(props,propName,componentName) {
let age=props[propName];
if (age <0 || age>120) {
return new Error(`Invalid Prop ${propName} supplied to ${componentName}`)
}
}
}
render() {
let {name,age,gender,hobby,position}=this.props;
return (
姓名
年龄
性别
爱好
位置
{name}
{age}
{gender}
{hobby.join(',')}
{position.x+' '+position.y}
)
}
}
let person={
age: 100,
gender:'male',
hobby: ['basketball','football'],
position: {x: 10,y: 10},
}
ReactDOM.render( , document.getElementById('root'));
在表单中有受(状态)控组件和非受控组件
受控组件就是需要添加 onChange
受控好处:- 可以给输入框赋予默认值 - 实时校验
非受控
非受控好处:- 简单,也不写状态
非受控坏处:- 不能实时校验
ref 相当于别名
ref设值or取值
import React,{Component} from "react";
import ReactDOM from "react-dom";
class Control extends Component{
password = React.createRef();//新版本 16.3采用的
handleClick=()=>{
//取值
console.log(this.username.value);//
console.log(this.refs.aaa)// 废弃的
//this.password.current 才是真实的dom
console.log(this.password.current.value);
}
render(){
return
{this.username = dom}} />
//新版本
}
}