一、插件安装
组件有两种后缀名字。第一种是js结尾的文件,第二种jsx结尾的文件。习惯用jsx结尾。
后续我们用JSX结尾的文件,开发提示友好。
二、组件概念
react基于组件开发,单文件开发。组件开发将页面UI的内容拆分为一个一个的模块。
react组件分类两种类型:
- 函数组件:组件内部用函数来定义(无状态组件)
- 类组件:组件内部用类定义(有状态组件)
状态:组件内部的数据。
React设计的时候,提出了两种组件的开发方式,目前前端的开发方式,面向对象编程,函数式编程。
先学习类组件,后面再学习函数,两则可以再项目中混用。
三、组件分类
函数组件
代码结构:使用RFC快捷键创建函数组件的模板
import React from 'react'
export default function Student() {
const username = "xiaowang"
return ( <div>Student</div> )
}
特点:
- 定义一个函数,最后将这个函数保留出去。函数里面return一个节点。
- 函数组件没有状态,目前你再函数组件里面定义的变量,渲染完成后如果发生数据变化,页面不会更新
类组件
类组件采用面向对象编程:创建类组件的快捷键RCC
import React, { Component } from 'react'
export default class Classes extends Component {
render() {
return ( <div>Classes</div> )
}
}
特点:
- 首先要定义一个类,集成Component这个组件。这个组件才能称为React类组件
- Component:React官方提供的一个组件,任何一个类集成这个Component,这个类变成组件
- 子组件如果要渲染完成节点,必须重写render方法,优先调用你们重写render方法
- 有状态的组件,类里面定义的数据,可以响应式变化
四、组件中的样式
组件的三大部分:
HTML模板:不管再类组件还是函数组件中,Jsx已经将js和模板结合。
JS:JSX的语法来完成
样式:内部样式,外部样式
内部样式
import React from "react"
class Teacher extends React.Component{
render(){
return (
<div style={{color:"red",fontSize:"20px"}}>123</div>
)
}
}
export default Teacher
JSX 已经将所有的css样式都做了封装。
<div style={}>123</div> //动态绑定属性
<div style={{color:"red"}}>123</div> //动态绑定属性
给style传递了一个对象,对象封装就是css样式。
<div style={{color:"red",fontSize:"20px"}}>123</div> //动态绑定属性
样式属性对应的结果,一定式字符串
外部样式
将样式文件定义到外部文件中,引入到这个组件内部
现在assets目录下面创建一个styles文件夹,common.css文件
设计样式代码
.box{ width: 100px; height: 100px; background-color: red;}
再组件中引入这个css样式
import React from "react"
import "../assets/styles/common.css"
class Teacher extends React.Component{
render(){
return (
<>
<div className="box"></div>
</>
)
}
}
export default Teacher
当你页面上某个元素className跟样式文件的class名字匹配。作用成功
五、组件中的图片
再传统网页中要使用图片
<img src="../images/1.jpg"/>
再react组件中使用图片
import wechat from "../assets/images/wechat.jpg"
export default class ImageLoad extends Component {
render() {
return (
<div>
<img src={wechat} alt="" />
</div>
)
}
}
import的方式引入图片,我们可以再组件模板里面动态加载
如图片在线地址,我们直接img里面填充这个地址
<img src="//m15.360buyimg.com/mobilecms/jfs/t1/189296/25/22157/194537/62398c02Ed8a20199/6f0720a392c5e4bc.jpg!cr_1125x449_0_166!q70.jpg" alt="" />
如果你只知道图片的地址,我们要动态加载
<img src={require("../assets/images/wechat.jpg")} alt="" />
如果只知道图片的路径,从本地获取图片,直接使用require来加载。
以前再react17这个版本里面
<img src={require("../assets/images/wechat.jpg").default} alt="" />
如果再css样式中要引入一张图片,如何办
<div style={{width:"100px",height:"100px",background:`url(${require("../assets/images/wechat.jpg")})`}}></div>
只要是再组件中使用图片,就两种方式。
import的方式,require的方式。包括背景图片也一样。
<div style={ {width:"100px", height:"100px", background:`url(${wechat})`}}></div>
六、组件中事件
我们需要给指定的节点绑定一些事件。
回顾再js中给一个元素绑定事件
<button onclick="check"></button>
Vue中绑定事件
<button @click="check"></button>
React中要给元素绑定事件,使用JSX,已经将所有的JS事件做了封装。再React所有的事件都是合成事件。
规则
React的事件和DOM事件很相似,但是又不一样
-
React的事件采用小驼峰命名
onclick---->onClick -
再绑定事件函数定时候,你传递一个函数进入,而不是一个字符串
onclick="show"---->onClick={this.check}
基础语法
export default class EventComp extends Component {
check() {
console.log(123);
}
render() {
return (
<div>
<button onClick={this.check}>点击触发</button>
<input type="text" onBlur={this.check} />
</div>
)
}
}
再绑定事件的时候,需要再括号中this的方式来找到指定的函数
关于this问题(重点)
绑定事件的时候,我们可以定义普通函数来作为事件函数
import React, { Component } from 'react'
export default class EventComp extends Component {
check() {
console.log(this);
}
render() {
return (
<div>
<button onClick={this.check}>点击触发</button>
</div>
)
}
}
check是一个普通函数,普通函数this,由调用者来决定。check里输出this默认指向button按钮,react对这种情况做了处理,直接处理undefined
如果我们再事件函数里面需要得到的this为当前这个组件对象
<button onClick={this.check.bind(this)}>点击触发</button>
bind (this)==>这个this代表的当前整个组件。传递给check函数,相当于check函数内部的this默认变成整个组件,
check(){ this.show()}
采用箭头函数的方式来定义,可以解决this指向问题
import React, { Component } from 'react'
export default class EventComp extends Component {
show = ()=>{
console.log(this);
}
render() {
return (
<div>
<button onClick={this.show}>点击</button>
</div>
)
}
}
show是箭头函数,一开始就已经确定了this指向问题。show函数内部输出this默认一直指向EventComp
参数问题
再react中事件函数不能直接一来就调用
<button onClick={this.add(1,2)}>参数</button>
页面加载完毕后,add函数就立即执行。
<button onClick={()=>this.add(1,2)}>参数</button>
onClick对应绑定的是一个箭头函数,触发点击事件才会执行。箭头函数执行,里面add立即执行