React起手式

1.如何引入React(开发基本不使用这种方式)

  • CDN引入 (注意顺序)
  • 引入React:https://.../react.x.min.js
  • 引入 ReactDOM:https://.../react-dom.x.min.js
cjs 和 umd 的区别
  • cjs 全称CommonJS,是Node.js 支持的模块规范
  • umd是统一模块定义,兼容各种模块规范(含浏览器)
  • 理论上优先使用umd,同时支持Node.js和浏览器
  • 最新的模块规范是使用import和export关键字
通过webpack引入React
  • yarn add react react-dom
  • import React from 'react'
  • import ReactDOM from 'react-dom'
  • 注意大小写,尽量保持一致
  • 还可用create-react-app一键代替以上步骤
其他
  • 除webpack外,rollup、parcel也支持上面写法
引入React:新手用create-react-app,老手用webpack/rollup

2. 开始创建React应用

yarn global add create-react-app
create-react-app demo1(文件名)

然后一个React项目便初步搭建

// index.js
import React from 'react';
import ReactDOM from 'react-dom';

ReactDOM.render(
    <div>你好</div>,
    document.getElementById('root')
);

屏幕显示'你好'

3. React 初体验

对比React元素和函数组件
  • App1 = React.createElement( 'div', null, n)
  • App1是一个 React元素
  • App2 =()=> React.createElement( 'div', null,n)
  • App2是一个 React函数组件
启示
  • 函数App2是延迟执行的代码,会在被调用的时候执行
  • 这是代码执行的时机,并不是同步和异步
React元素
  • createElement的返回值element可以代表一个div
  • 但element并不是真正的div (DOM对象)
  • 所以我们一般称element为虚拟DOM对象
()=> React 元素
  • 返回element的函数,也可以代表一个div
  • 这个函数可以多次执行,每次得到最新的虚拟div
  • React 会对比两个虚拟div,找出不同,局部更新视图
  • 找不同的算法就叫做DOM Diff算法

4. JSX初体验

Vue的模板写法 Vue-loader
  • .vue文件里写

  •   <template> <script> <style>
    
  • 通过vue-loader变成一个构造选项

React的 JSX
  • 可以把

  •   <button onClick="add">+1</button>
    
  • 变成

  •   React.createElement('button',{onClick:...},'+1')
    
  • 与Vue-loader 类似

  • 在 React 这里叫做 babel-loader ,并且被内置在webpack里面了

  • 当然也可以使用 CND 引入 babel-loader

使用 JSX
  1. 方法一
  • CND引入
  • 引入babel.min.js
  • 把<script>改成<script type="text/babel">
  • babel会自动进行转译(可以理解为翻译),此处画图
  • 这种方式似乎并不支持src
  • 在生产环境下尽量不要使用 CND引入,效率太低
  • 他要下载一个 babel.min.js
  • 它还要在浏览器端把 JSX 翻译成 JS
//   引入 JSX 后的写法
<script type='text/babel'>
    let n = 0;
    const App = () => (
        <div>     // 标签直接写
                {n}   // 变量使用
            <button 
                onclick = {   // 函数花括号括起来
                () => {
                    n++;
                    render();
                }
            }
            >
                +1
            <button>
        </div>
    );
    const render = () => React.render(<App />,document.querySelector('#app'));
    render();
</script>
  1. 方法二

可以使用 webpacl + babel-loader

  1. 方法三

使用 create-react-app

  • 跟@vue/cli用法类似
  • 全局安装yarn global add create-react-app
  • 初始化目录create-react-app react-demo-1
  • 进入目录cd react-demo-1
  • 开始开发yarn start
  • 这时App.js便会默认就使用 jsx 语法
  • 这是因为webpack 让JS默认走babel-loader
注意事项
  •   <div className='red'>n</div>   <!-- 类名要写成className -->
    
  • 因为这会被翻译成

  •   React.createElement('div',{className:'red'},'n');
    
  • 标签里面的所有JS代码都要使用 {} 花括号包起来

5. 条件判断

在 React 里面

const Compomnent = () => {
    return n%2 === 0 ? <div>n是偶数</div> : <span>n是奇数</span>;
}
// 如果需要外面的div,可以写成
const Component = () => {
    return (
        <div>
            {
                n%2 === 0? <div>n是偶数</div> : <span>n是奇数</span>
            }
        </div>
    )
}

还可以写成

const Component = () => {
    const content = (
        <div>
            {
                n % 2 === 0? <div> n是偶数 </div> : <span> n是奇数 </span>
            }
        </div>
    )
    return content
}

还可以写成

const Component = () => {
    const inner =  n% 2 ===0? <div> n是偶数 </div> : <span> n是奇数 </span>
    const content = (
        <div>
            { inner } 
         </div>
    )
    return content
}

如果想要使用 if else

const Component = () => {
    let inner
    if(n%2===0){
        inner = <div>n是偶数</div>
    } else {
        inner = <span> n是奇数 </span>
    }
    const content = (
        <div>
            { inner }
        </div>
    )
    return content
}

6. 循环语句

在 React 里面使用循环

const Component = (props) => {
    return props.number.map((n,index) => {
        return <div>下标{index}值为{n}</div>
    })
}
//  如果需要使用外面的 div,可以写成
const Component = (props) => {
    return (
        <div>
            {
                props.number.map((n,index) => {
                    return <div> 下标 {index} 值为 {n} </div>
                })
            }
        </div>
    )
}

还可以这样写

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

推荐阅读更多精彩内容

  • 1.cdn引入,要引入两个react,react-dom,注意顺序先react,cdn很麻烦一般不使用, 2.um...
    Ories阅读 354评论 0 0
  • 引入React CDN引入Reactbootcdn cjs 和 umd 的区别 cjs 全称是 Common JS...
    fanison阅读 499评论 0 0
  • 从CDN引入React(不推荐) 引入React要比Vue要麻烦,Vue只需引入一个即可,而React同时要引入三...
    luci_dity阅读 388评论 0 0
  • React框架学习 React的起源和发展 起初facebook在建设instagram(图片分享)的时候嘞,因为...
    hcySam阅读 674评论 0 1
  • React框架学习 React的起源和发展 React的出发点 React与传统MVC的关系 React高性能的体...
    J_Ronaldo阅读 439评论 0 1