react入门(一)

2017-10-24  本文已影响0人  叶夏星辰

react.js是核心库,react-dom.js提供与DOM相关功能,Browser是将JSX语法转化为js语法
ReactDom.render用于将模板转为HTML语言,并插入指定DOM节点,传两个参数,(object:object,DOM:object)

JSX的语法

html直接写在js中,不加任何引号
js语法写在花括号{ }中

var names = ['Alice', 'Emily', 'Kate'];
ReactDOM.render(
  <div>
  {
    names.map(function (name) {
      return <div>Hello, {name}!</div>
    })
  }
  </div>,
  document.getElementById('example')
);

在JSX中不能使用if slse
react使用className和htmlFor代替class和for

JSX表现为对象
Babel编译JSX在React.createElement()调用的时候。
下面两个例子是相似的

const element = (
  <h1 className="greeting">
    Hello, world!
  </h1>
);
const element = React.createElement(
  'h1',
  {className: 'greeting'},
  'Hello, world!'
);

关于组件,组件类的首字母必须大写,否则会报错,组件类只能包干一个顶层标签,即最外层标签只能有一个
(JSX使用大小写的约定来区分本地组件的类和HTML标签)
向组件传递参数,可以使用this.props对象,对象的属性与组件的属性一一对应,
props属性可以用来组件之间传值。

var HelloMessage = React.createClass({
  render: function() {
    return <h1>Hello {this.props.name}</h1>;
  }
});
 
ReactDOM.render(
  <HelloMessage name="Runoob" />,
  document.getElementById('example')
);

但是有一个例外就是this.props.children,表示组件的所有子节点

this.props.children的值

如果组件没有子节点,值为undefined;一个子节点,数据类型是object;如果多个子节点,数据类型是array
react提供了React.Children来遍历子节点而不用担心this.props.children的数据类型

React State

通过与用户的交互,实现不同状态,然后渲染UI,让用户界面和数据保持一致。
只需更新组件的state,根据新的state重新渲染用户界面(不要操作DOM)

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 ? '喜欢' : '不喜欢';
          return (
            <p onClick={this.handleClick}>
              你<b>{text}</b>我。点我切换状态。
            </p>
          );
        }
      });

      ReactDOM.render(
        <LikeButton />,
        document.getElementById('example')
      );

onClick等事件,on之后第一个字母是大写的,小写的事件将不生效

State 和 Props

state和props可以组合使用,可以在父组件中设置state,并通过在子组件上使用 props 将其传递到子组件上。在 render 函数中, 我们设置 name 和 site 来获取父组件传递过来的数据。

var WebSite = React.createClass({
  getInitialState: function() {
    return {
      name: "jjj",
      site: "http://www.baidu.com"
    };
  },
  clickfun:function (){
      this.setState({name:(this.state.name=="jjj"?"aaa":"jjj")});
      console.log(this);
  },
  render: function() {
    return (
      <div onClick={this.clickfun}>
        <p onClick={this.clickfun}>子元素,点击事件生效</p>
        <Name name={this.state.name} onClick={this.clickfun}/>
        <Link site={this.state.site} />
      </div>
    );
  }
});
 
var Name = React.createClass({
  render: function() {
    return (
      <h1>{this.props.name}</h1>
    );
  }
});
 
var Link = React.createClass({
  render: function() {
    return (
      <a href={this.props.site}>
        {this.props.site}
      </a>
    );
  }
});
 
ReactDOM.render(
  <WebSite />,
  document.getElementById('example')
);

示例中,绑定在顶层元素和子元素p上的事件生效,绑定在子组件Name上的事件不生效,应该是子组件无法获取到父组件上的clickfun函数,因为传值是使用props

上一篇下一篇

猜你喜欢

热点阅读