RN(三)--React JSX、初识React组件化

一、React JSX

1. JSX简介

JSX就是Javascript和XML结合的一种格式。React发明了JSX,利用HTML语法来创建虚拟DOM。当遇到<,JSX就当HTML解析,遇到{就当JavaScript解析。

如下(JS写法)

var child1 = React.createElement('li', null, 'First Text Content');
var child2 = React.createElement('li', null, 'Second Text Content');
var root = React.createElement('ul', { className: 'my-list' }, child1, child2);

等价于(JSX写法)

var root =(
  <ul className="my-list">
    <li>First Text Content</li>
    <li>Second Text Content</li>
  </ul>
);

后者将XML语法直接加入JS中,通过代码而非模板来高效的定义界面。之后JSX通过翻译器转换为纯JS再由浏览器执行。在实际开发中,JSX在产品打包阶段都已经编译成纯JavaScript,JSX的语法不会带来任何性能影响。另外,由于JSX只是一种语法,因此JavaScript的关键字class, for等也不能出现在XML中,而要如例子中所示,使用className, htmlFor代替,这和原生DOM在JavaScript中的创建也是一致的。JSX只是创建虚拟DOM的一种语法格式而已,除了用JSX,我们也可以用JS代码来创建虚拟DOM.

2. JSX!=HTML

JSX形式上非常像常见的HTML,但它并不是一种标记语言,它实,是调用React.createElement函数,所以在使用JSX时,务必在头部
import React from ‘react’;
JSX只是借鉴HTML的规则/规范:

  • 开始和结束标签配对
    <组件>....</组件>
  • 无内容的组件标签应写为自封闭形式
    <组件></组件>应写为<组件 />
  • 可自定义属性,字符串值应用双引号,其他值用{}括起来
    <person name="Tom" age={30} married={true} />
  • 布尔值可省略值
    <person married />等价于<person married={true} />
  • 必须单一子节点


  • "空值"自动忽略
    <div />
    <div></div>
    <div>{false}</div>
    <div>{true}</div>
    <div>{null}</div>
    <div>{undefined}</div>
    //所以可以用来显示或隐藏标签
<View>
{isShow && <Text>Warning</Text>} //此处若isShow为true,则返回text组件(并非true值),所以可以显示
</View>
  • 组件必须大写字母开头
  • 文本必须写在Text组件内
<View>
<Text>
你好吗!
</Text>
</View>
  • 注释比较特殊是{/**/},有别于js部分的//和/**/
    {/*<View />*/}
  • 只能嵌入表达式
//错误写法
{if(true) {return <Text />}};
{for(let i=0; i<arr.length; i++) {....}};
//正确的写法
{isTrue && <Text />};
{arr.map(i=><Text>{i.text}</Text>)};
//如果是复杂的逻辑可以另写函数在这里只是调用
{doSomething()};

更多内容,可看Introducint JSX
facebook.github.io/react/docs/introducing-jsx.html
JSX In Depth
https://facebook.github.io/react/docs/jsx-in-depth.html

三、初识React组件化开发

首先,介绍一款在线的模拟器
),非完整模拟,但是我们可以用来练习基础。

1. class/function都可以作为积木(组件)
//class
class GoodMorning extends Component {
  render() {
    return (
      <Text>GoodMorning</Text>
    )
  }
}
//function
const GoodEvening = () => {
  return
  (
    <Text>GoodEvening</Text>
  )
}

//都可以作为App的组件
export default class App extends Component {
render() {
    return (
      <View>
        <GoodMorning />
        <GoodEvening />
      </View>
    )
  }
}

输出:

GoodMorning
GoodEvening
2. 使用属性props定制“积木”(组件)
class GoodMorning extends Component {
  render() {
    return (
      <Text>GoodMorning,{this.props.name}</Text>
    )
  }
}

const GoodEvening = (props) => {
  return
  (
    <Text>GoodEvening,{props.name}</Text>
  )
}

export default class App extends Component {
render() {
    return (
      <View>
        <GoodMorning name="Li" /> {/*使用时传入属性*/}
        <GoodMorning name="Wang" /> {/*使用时传入属性*/}
      </View>
    )
  }
}

输出:

GoodMorning,Li
GoodEvening,Wang
3. defaultProps默认值和propTypes类型约束
class Demo extends Component{
static defaultProps = {
  name : 'WangDaChui',//赋值默认值
}
static propTypes = {
  name : React.propTypes.string,//约定类型为string
}

render...
}

defaultProps和propTypes写法类似(都为静态成员属性)。
propTypes只在开发阶段有效,发布时会被自动移除。
根据编码习惯爱好自由取舍。

4. 变量作用域
  • 函数内的局部变量,只能函数内读写,函数运行结束,自动销毁。
  • class内的成员变量,在单个class的实例内读写,实例销毁时,一并销毁。使用时,使用this。
  • class内的静态成员变量,在所有class的实例中共享,不会自动销毁。而且其他模块可以通过此class访问(类public)。
  • class外的变量,在所有class实例内共享,不自动销毁。除非明确export,否则其他模块不可访问(类private)。
  • global全局变量,任何地方都可读写(类浏览器的window),不自动销毁。
    global.test = 1;则以后任何地方都可以alert(global.test)alert(test)
5. class内的成员变量写法
class Demo extends Component{
    name = 'Tom'; //注意没有任何let var声明符号
    render(){....}
}

//我们写的时候还是推荐上边的写法。还有一种写法,是老写法,我们知道即可:

class Demo extends Component {
    constructor(props) {
        super(props);  // 照抄即可,不可省略
        this.xxx = 1;    //声明的成员变量
    }
    render() {
    …….
    }
}

6. 动态生成组件列表与key
  • 根据多个数据生成多个组件,我们一般使用map方法。注意,箭头函数的返回值,如果有{},记得加return。
  • 循环生成的组件需要有唯一的key值区分,因为有Virtual DOM(Virtual Dom我们后边会介绍)。
{['a','b'].map(i=><Text key={i}>{i}</Text>)}

1.key属性放在循环的直接容器上。
2.key值优先使用区分度较高的值(id,具体内容),其次考虑数组下标。
3.key值只需在当前循环中不重复。

7. state

万物生长靠太阳,界面变化靠状态(state)

  • 一切界面变化都是state的变化。
  • state的修改必须通过setState()方法:this.setState({ likes : 3, })
  • setState是异步操作,修改不会马上生效。
    看一段例子就能理解,定义、使用、修改:
export default class App extends Component {
  state = { //定义state
    likes : 2,
  }
  onPress = ()=>{
    const {likes} = this.state;
    this.setState({ //通过setState,修改state中的值
      likes : likes+1,
    }
    )
  }
render() {
  return(
      <View>
      <TouchableOpacity onPress={this.onPress}>
        <Text>{this.state.likes}</Text> //使用state中的值
      </TouchableOpacity>
      </View>
  )
  }
}
8. VIRTUAL DOM

状态的变化会带来界面的变化,状态不断变化会带来性能问题吗?

React会自动计算出差异部分,以最小的差异去重新渲染,在内存中“打草稿”的这一概念便称为VIRTUAL DOM。

VIRTUAL DOM,正式通过key来判断哪些是已有的,哪些是新增的,以最小的差异去重新渲染。

参考:
React Native中文网

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 本笔记基于React官方文档,当前React版本号为15.4.0。 1. 安装 1.1 尝试 开始之前可以先去co...
    Awey阅读 7,619评论 14 128
  • 原教程内容详见精益 React 学习指南,这只是我在学习过程中的一些阅读笔记,个人觉得该教程讲解深入浅出,比目前大...
    leonaxiong阅读 2,805评论 1 18
  • 3. JSX JSX是对JavaScript语言的一个扩展语法, 用于生产React“元素”,建议在描述UI的时候...
    pixels阅读 2,794评论 0 24
  • 深入JSX date:20170412笔记原文其实JSX是React.createElement(componen...
    gaoer1938阅读 8,026评论 2 35
  • 2017年这一年经历了许多变化,走了很多路,认识了很多人,去了很多地方,我看到了不一样的自己。 问了很多人,201...
    北方小确幸阅读 134评论 1 2