React 是什么?
React 时Facebook推出的JacaScript Library,它是一个用于组件JavaScrtipt库,让你更简单的创建交互式用户界面,它的出现让许多革新性的Web观念开始流行起来,例如:Virtual DOM 、Component、声明式渲染等。
声明式渲染和命令式渲染的区别是什么?
声明式渲染:
简单来讲就是告诉“机器”,你想要的是什么,让“机器”想出如何去做。比如如下代码:
let name = "张三";{name}
命令式渲染:
简单理解就是命令“机器”如何去做事情,这样不管你想要的是什么,它都会按照你的命令去实现。比如如下代码,通过document中函数获取h1标签,然后给这个标签中的元素进行赋值,这每一步都需要告诉程序做怎么做。
document.querySelector("h1").innerHTML = "小红";
怎么使用React?
使用之前需要配置React开发环境
Note.js的安装:
- 通过在Node.js官网下载安装包进行安装即可
- 安装完Node.js以后通过npm -v 命令查看是否安装成功
React 命令行工具的安装:
- 安装完Node.js以后,在命令行输入如下命令进行安装
npm install -g create-react-app
creat-react-app helloword
cd helloword
npm start
JSX
JSX 是一个看起来像XML的JavaScript语法扩展。每一个JSX标签都会被JSX转换工具转换成一个纯JavaScript代码,使用JSX会使组件的结构和组件之间的关系看上去更加的清晰,并且它可以定义简介且我们熟知的包含属性的树状结构语法。具体代码如下所示:
Welcome to React Native!
To get started, edit App.js
{instructions}
HTML和React组件对比
React可以直接渲染HTML标签,一般都是小写字母开头,比如<div></div>标签。同时也可以直接渲染React组件,不过在使用React组件时,必须以大写字母开头,就比如在其它组件使用Props_3组件时,JSX标签就必须是以大写字母开头,就算是将组件的名称改为小写也会报错。如下代码:
正确写法:
import Props_3 from './src/components/Props_3'
export default class App extends Component {
render() {
return (
);
}
}
JSX用小写字母开头的错误提示:
JavaScript 表达式
如果想在JSX标签中使用JavaScript表达式,那么只需在JacaScript表达式之外添加一对大括号{ }即可,如下代码:
import React,{Component} from 'react'
import {StyleSheet,Text,View} from 'react-native'
export default class Main extends Component {
render() {
/*
* name={1>0?"张三":"李四"} {JavaScript表达式}
*
*案例一:在JSX标签属性中使用使用JavaScript表达式
*0?"张三":"李四"}>
*
*案例二:在JSX标签内部使用JavaScript表达式
* */
return{1>0?"张三":"李四"}
}
}
JSX中的注释
在JSX标签外部进行注释的方式有单行注释(//)和多行注释(/**/),如下代码:
/*
* 多行注释
* */
在JSX标签内部进行注释的方式为{/*多行注释*/’},如下代码:
{/*
多行注释
*/}
延展属性
JSX中的延展属性类似于Vue中的延展操作符,使用它可以将对象进行展开,然后传入数据。比如如下代码:
import React,{Component} from 'react'
import {StyleSheet,Text,View} from 'react-native'
export default class ExtensionAttributes_4 extends Component {
render(){
let attr = {
styles:styles.welcome,
disabled:true,
};
/*
* {...attr} 延展属性的使用,其中attr是一个对象,...表示将attr这个对象进行展开
*
* */
return延展属性
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: 'red',
},
welcome: {
fontSize: 20,
textAlign: 'center',
margin: 10,
},
});
Component
React允许将JS代码封装成一个组件(Component),然后向插入普通HTML标签一样,将封装好的组件插入进JSX标签中,如下代码:
通过JS创建的组件
引入自定义的组件
props(组件的属性)
可以通过this.props.属性名 的形式获取组件对象的属性,对象的属性名可以任意创建,但是要避免与JacaScript关键字冲突。props一般用于父组件传递数据给子组件,在子组件中定义父组件要传递的属性(默认值和该属性的数据类型),然后由父组件根据这个属性去传递数据给子组件。这点与Vue中的props是一样的,只不过表现形式不一样而已。
PropTypes
组件的属性可以接收任意数据类型,比如:字符串、number、布尔值、函数等等。有时,我们需要一种机制,去验证别人使用组件时,提供的参数是否符合要求。比如该组件的属性只能传递字符串,那么就可以利用PropTypes属性来规定标准。代码如下:
定义
import React,{Component} from 'react'
import {StyleSheet,Text,View} from 'react-native'
import PropTypes from 'prop-types'
export default class PropTypes_5 extends Component {
/*
* title:PropTypes.string 表示规定传入的title数据必须是一个字符串,其它数据类型不可传入
* */
static propTypes = {
title:PropTypes.string
};
/*
* title 属性的默认数据,如果没有传入title属性,那么其默认值为 我是默认数据
* */
static defaultProps = {
title:'我是默认数据'
};
render(){
returnPropTypes的使用,{this.props.title}
}
}
使用
import React, {Component} from 'react';
import {Platform, StyleSheet, Text, View} from 'react-native';
/*
引入自定义组件
* */
import PropTypes_5 from './src/components/PropTypes_5.js'
export default class App extends Component {
render() {
let title = "测试";
return (
);
}
}
如若传递的不是字符串类型,会爆如下错误
ref属性
通过ref属性可以获取组件真是的DOM元素,这点与Vue相似。详细代码如下:
父组件
import React,{Component} from 'react'
import {Text,View} from 'react-native'
import Subcomponent from './Subcomponent'
export default class Ref_6 extends Component {
notificationSubcomponent = () => {
console.log("notificationSubcomponent被执行了");
//notificationSubcomponent被执行了
this.refs.subcomponent.showMessage("父组件调用子组件中的函数,并且传递参数");
}
render(){
/*
* onPress 为点击事件,该点击事件只能在Text标签中使用有效,在View标签中使用无效
*ref="subcomponent" 表示给当前这个Subcomponent组件设置一个ref属性,然后可以通过this.refs.subcomponent获取当前这个标签的DOM对象
* */
return
点我使用ref
}
}
子组件
import React,{Component} from 'react'
import {Text,View} from 'react-native'
export default class Subcomponent extends Component{
/*
* 自定义了一个显示信息的函数
* */
showMessage(message){
console.log(message);
//父组件调用子组件中的函数,并且传递参数
}
render(){
return null;
}
}
state(状态)
state 中的数据是这个组件私有的,其它组件是无法修改其中的值。而props中的数据是父组件传递过来的,子组件是无法修改父组件传递过来的数据的。其实我个人理解,这个state就类似于Vue中的data(){ return {}} 返回的数据,在其中定义的activeIndex属性就是这个组件所使用的,如下代码:
data() {
return {
activeIndex: "1",
}
},
react-native 中使用案例如下:
import React,{Component} from 'react'
import {Text,View} from 'react-native'
export default class State_7 extends Component{
constructor(){
super();
/*
*初始化state
* */
this.state = {
isShow:true,
};
/*
* 每1秒切换一个状态
* */
setInterval(() =>{
this.setState(newSate =>{
return {
isShow: !newSate.isShow
}
})
console.log("setInterval()被执行了");
//setInterval()被执行了
},1000)
}
render(){
/*
* 根据当前的状态显示对应视图
* */
if (this.state.isShow){
returnstate的使用案例
}else {
return null;
}
}
}