初始React

假设有一个需求,点击按钮改变文本的值。

1、通过原生JavaScript来实现

<script>
  <h2 class="title">hello world</h2>
  <button class="btn">按钮</button>

  <script>
    let message = "Hello World!"
  let titleEle = document.getElementsByClassName('title')[0]
  titleEle.innerHTML = message

  document.getElementsByClassName('btn')[0].addEventListener('click', event => {
    message = "Hello React!"
    titleEle.innerHTML = message
  })
</script>

从编程范式的角度来说,原生js的实现方式叫做命令式编程,当下流行的前段三大框架(vue,react,angluar)都是声明式编程方式。目前,常见的编程范式主要有三种命令式声明式函数式

2、React实现文本渲染

2.1 添加React的依赖

  • 通过CDN引用的方式添加
<script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
  • 可以通过本地文件引用的方式添加依赖
<!-- 引入本地react依赖 -->
<script src="./lib/react.development.js"></script>
<script src="./lib/react-dom.development.js"></script>
<script src="./lib/babel.min.js"></script>
<!-- type类型必须写成text/babel,否则babel不会去解析jsx语法 -->
<script type="text/babel">
    let msg = "Hello World!"
    // render函数参数,第一个:需要被渲染的jsx代码;第二个:被渲染的元素挂载到哪里
    ReactDOM.render(<h2>{msg}</h2>, document.getElementById("app"))
</script>

目录结构


WX20200824-170847@2x.png

2.2 三个文件的作用:

  • react.development.js 包含react所必须的核心代码
  • react-dom.development.js react渲染在不同平台所需要的核心代码
  • babel.min.js 将jsx转换成React代码的工具
<div id="header"></div>
<div id="app">adfasdfasdf</div>
<div id="footer"></div>

<script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
<!-- type类型必须写成text/babel,否则babel不会去解析jsx语法 -->
<script type="text/babel">
    let msg = "Hello World!"
    // render函数参数,第一个:需要被渲染的jsx代码;第二个:被渲染的元素挂载到哪里
    ReactDOM.render(<h2>{msg}</h2>, document.getElementById("app"))
</script>

直接调用ReactDOMrender函数渲染组件到指定的元素中

3、 在React中绑定事件

现在需要在jsx中添加button按钮,并绑定事件用来改变文本

let msg = "Hello World!"

function btnClicked() {
    msg = "Hello React!";
    console.log(msg);
}

ReactDOM.render((
  <div>
    <h2>{msg}</h2>
    <button onClick={btnClicked}>改变标题</button>
  </div>
 ), document.getElementById("app"))

render的第一个参数如果需要换行的话一般会加上(),第一个参数必须是一个dom节点,不能多个节点,否则报错。上面的h2标签和button标签都被包括在div中,div作为一个根节点。

button的绑定事件需要使用onClick指令,注意:<u>Click中首字母是大写的</u>

上述代码能够改变msg的值,但是页面还不会改变

WX20200824-161624@2x.png

因为msg变量的改变不会触发render函数,也就是msg的值改变了没有重新渲染页面

可以稍作更改,如下

let msg = "Hello World!"

function btnClicked() {
  msg = "Hello React!";
  console.log(`msg is ${msg}`);
  render();
}

function render() {
  // render函数参数,第一个:需要被渲染的jsx代码;第二个:被渲染的元素挂载到哪里
  ReactDOM.render((
    <div>
        <h2>{msg}</h2>
        <button onClick={btnClicked}>改变标题</button>
    </div>
  ), document.getElementById("app"));
}

render();
WX20200824-162039@2x.png

4、组件化实现

<script type="text/babel">
  class App extends React.Component {
    constructor() {
      super();
      this.state = {
        msg: 'Hello World'
      }
    }
    render() {
      return (
        <div>
          <h2>{this.state.msg}</h2>
          <button onClick={this.btnClicked.bind(this)}>改变文本</button>
        </div>
      )
    }

    btnClicked = () => {
      // 这种方式不会触发render函数,不会重新渲染页面
      // this.state.msg = "Hello React!" 
      // 必须使用setState这种方式
      this.setState({
        msg: "Hello React!"
      })
    }
  }
  ReactDOM.render(<App />, document.getElementById('app'));
</script>

组件必须继承自React.Component

button的click事件需要绑定到App组件上,否则btnClicked函数中的this会是undefined

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