0
点赞
收藏
分享

微信扫一扫

React基础入门(4)

React 是什么?

         React 时Facebook推出的JacaScript Library,它是一个用于组件JavaScrtipt库,让你更简单的创建交互式用户界面,它的出现让许多革新性的Web观念开始流行起来,例如:Virtual DOM 、Component、声明式渲染等。

         声明式渲染和命令式渲染的区别是什么?

                   声明式渲染:

                             简单来讲就是告诉“机器”,你想要的是什么,让“机器”想出如何去做。比如如下代码:

let name = "张三";

{name}

                   命令式渲染:

                            简单理解就是命令“机器”如何去做事情,这样不管你想要的是什么,它都会按照你的命令去实现。比如如下代码,通过document中函数获取h1标签,然后给这个标签中的元素进行赋值,这每一步都需要告诉程序做怎么做。

 document.querySelector("h1").innerHTML = "小红";

 

怎么使用React?

             使用之前需要配置React开发环境

Note.js的安装:

  1. 通过在​​Node.js官网​​下载安装包进行安装即可
  2. 安装完Node.js以后通过npm -v 命令查看是否安装成功React基础入门(4)_javascript

          

React 命令行工具的安装:

  1. 安装完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用小写字母开头的错误提示:

React基础入门(4)_javascript_02

 

 

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创建的组件

React基础入门(4)_数据_03

 

引入自定义的组件

React基础入门(4)_javascript_04

 

 

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(){
return PropTypes的使用,{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 (



);
}
}

 

 如若传递的不是字符串类型,会爆如下错误

React基础入门(4)_数据_05

 

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){
return state的使用案例
}else {
return null;
}
}

}

 

举报

相关推荐

0 条评论