RN博客学习

应公司的业务要求,现在又要转学RN,比几个月前的安卓还要懵逼,虽然还是有点猝不及防,但是心里略能接受,但是目前学习没有头绪,前端大神给推荐说看看阮一峰老师的博客,磕磕绊绊的弄了一周,现在刚看懂一点代码
本文是对阮一峰老师的React 入门实例教程学习的笔记

散记一些概念或者用法

  • 数组用法

JSX语法遇到数组,就会将数据内容展开,然后插入后引用的地方
eg0.

var arr = [
  <h1>Hello world!</h1>,
  <h2>React is awesome</h2>,
];
ReactDOM.render(
  <div>{arr}</div>,
  document.getElementById('example')
);

执行结果为

<div id="example">
  <div data-reactroot="">
    <h1>Hello world!</h1>
    <h2>React is awesome</h2>
  </div>
</div>
  • 组件类
  • React 允许将代码封装成组件进行使用,然后可以像HTML标签一样插入
  • 通过React.createClass生成组件类
  • 组件类必须要有自己的render方法,用于输出组件
  • 首字母必须大写
  • 引用格式为`<组件名 属性A="xx" 属性B="yy"... />
  • 组件类的实现必须包含一个顶层标签
  • eg1.
<body>
    <div id="example"></div>
    <script type="text/babel">
      var HelloMessage = React.createClass({
        render: function() {
          return <h1>Hello {this.props.name}</h1>;
        }
      });

      ReactDOM.render(
        <HelloMessage name="John" />,
        document.getElementById('example')
      );
    </script>
  </body>

运行结果

<div id="example">
  <h1 data-reactroot="">
    <!-- react-text: 2 -->
    Hello 
    <!-- /react-text -->
    <!-- react-text: 3 -->
    John
    <!-- /react-text -->
  </h1>
</div>
  • this.props.children
  • 此属性表示组件的所有子节点,但是不包含组件的子节点的子节点,简单来说值组件的儿子节点,不在遍历到孙子节点和重孙子节点

eg2.

var NotesList = React.createClass({
  render: function() {
    return (
      <ol>
      {
        React.Children.map(this.props.children, function (child) {
          return <li>{child}</li>;
        })
      }
      </ol>
    );
  }
});

ReactDOM.render(
  <NotesList>
    <span>hello</span>
    <span>world</span>
  </NotesList>,
  document.getElementById('example')
);

运行结果为

1.hello
2.world

对代码略作修改
<NotesList>增加一个字元素

<p>
  <span>!</span>
</p>

<!--即代码为--> 
ReactDOM.render(
  <NotesList>
    <span>hello</span>
    <span>world</span>
    <p>
        <span>!</span>
    </p>
  </NotesList>,
  document.getElementById('example')
);

通过查看页面代码


页面代码

通过运行,发现仅仅对 p 便签这个儿子元素进行了改变,对p的子元素并没有进行操作

  • 注意事项
    • 使用 this.props.children时可能返回三种结果
      • 当前没有子节点 ,返回undefined
      • 当前只有一个节点,返回object
      • 当前有多个节点,返回一个array
    • 由于直接使用可能会出问题,React 提供了React.Children.map来遍历节点,用法可以参考eg2,另外在官网提供了React.Children的更多用法
  • PropTypes

可以理解为一个属性类型校验,因为组件类属性可以为任意值(字符串、对象、函数等等),所以在特定的使用场景需要对属性的类型进行规定

  • eg3.
<script type="text/babel">
     var data = 123;
     var MyTitle = React.createClass({
       propTypes: {
         title: React.PropTypes.string.isRequired,
       },
       render: function() {
         return <h1> {this.props.title} </h1>;
       }
     });
     ReactDOM.render(
       <MyTitle title={data} />,
       document.getElementById('example')
     );
      </script>

本例中属性要求类型是字符串,但是赋值的时候是一个数值类型,运行的时候会有一个警告
Warning: Failed propType: Invalid prop 'title' of type 'number' supplied to 'MyTitle', expected 'string'.
更多PropTypes设置参考官方文档

设置属性的默认值,可用getDefaultProps

  • eg4.
var MyTitle = React.createClass({
  getDefaultProps : function () {
    return {
      title : 'Hello World'
    };
  },

  render: function() {
     return <h1> {this.props.title} </h1>;
   }
});

ReactDOM.render(
  <MyTitle />,
  document.body
);

程序执行完会显示 Hello World'

  • DOM & virtual DOM

组件并不是真实的 DOM 节点,而是存在于内存之中的一种数据结构,叫做虚拟 DOM (virtual DOM)。只有当它插入文档以后,才会变成真实的 DOM 。
根据 React 的设计,所有的 DOM 变动,都先在虚拟 DOM 上发生,然后再将实际发生变动的部分,反映在真实 DOM上,这种算法叫做 DOM diff ,它可以极大提高网页的性能表现。
当 virtual DOM 需要调用真实的DOM的时候,需要用到ref关键字

  • eg5.
var MyComponent = React.createClass({
  handleClick: function() {
    this.refs.myTextInput.focus();
  },
  render: function() {
    return (
      <div>
        <input type="text" ref="myTextInput" />
        <input type="button" value="Focus the text input" onClick={this.handleClick} />
      </div>
    );
  }
});

ReactDOM.render(
  <MyComponent />,
  document.getElementById('example')
);
  • 上面代码中,组件 MyComponent的子节点有一个文本输入框,用于获取用户的输入。这时就必须获取真实的 DOM 节点,虚拟 DOM 是拿不到用户输入的。为了做到这一点,文本输入框必须有一个 ref 属性,然后 this.refs.[refName] 就会返回这个真实的 DOM 节点。
  • 注意,由于 this.refs.[refName] 属性获取的是真实 DOM ,所以必须等到虚拟 DOM 插入文档以后,才能使用这个属性,否则会报错。上面代码中,通过为组件指定 Click 事件的回调函数,确保了只有等到真实 DOM 发生 Click 事件之后,才会读取 this.refs.[refName] 属性。
    React 组件支持很多事件,除了 Click 事件以外,还有KeyDownCopyScroll 等,完整的事件清单请查看官方文档。
  • this.state

通过state 属性实现当组件变化以后,状态随之改变的功能

  • eg6
var LikeButton = React.createClass({
  getInitialState: function() {
    return {liked: false};
  },
  handleClick: function(event) {
    this.setState({liked: !this.state.liked});
  },
  render: function() {
    var text = this.state.liked ? 'like' : 'haven\'t liked';
    return (
      <p onClick={this.handleClick}>
        You {text} this. Click to toggle.
      </p>
    );
  }
});

ReactDOM.render(
  <LikeButton />,
  document.getElementById('example')
);
  • 初始化属性状态: 在本例中定义了一个like状态,并初始化为false
  • this.setState 用于修改状态,当其每次修改以后,自动调用 this.render 方法,再次渲染组件,修改状态格式如下:
    this.setState({状态key: 状态value})
  • 区别:
    • this.props 表示那些一旦定义,就不再改变的特性,
    • this.state是会随着用户互动而产生变化的特性。
  • 运行结果


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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