React第二讲课堂笔记(JSX 语法)

1. 什么是 JSX

类似 xml 的语法,用来描述组件树

var HelloMessage = React.createClass({
  render: function() {
    return <div>Hello {this.props.name}</div>;
  }
});

React.render(<HelloMessage name="John" />, mountNode);

JSX是可选的,并不强制要求使用。如果不用JSX,用React提供的API写的话,应该是这样的,直接调用React的API来定义组件和DOM元素。


var HelloMessage = React.createClass({
  displayName: "HelloMessage",
  render: function() {
    return React.createElement("div", null, "Hello ", this.props.name);
  }
});

React.render(React.createElement(HelloMessage, {name: "John"}), mountNode);

2. 为什么要使用 JSX

你不需要为了 React 使用 JSX,可以直接使用纯粹的 JS。但我们更建议使用 JSX , 因为它能定义简洁且我们熟知的包含属性的树状结构语法。

3. 注释

import React, { Component } from 'react';

const name = 'yongfeng';
const MyComponent = () => {
    <Nav>
    {/* 一般注释, 用 {} 包围 */}
    <a
      /* 多
         行
         注释 */
      className={ name ? 'a' : 'b' } // 行尾注释
      href="http://guoyongfeng.github.io/idoc"
    > 注释 </a>
  </Nav>
};

export default MyComponent;

4. 命名

import React, { Component } from 'react';

// 1. 组件命名遵循驼峰命名,首字母大写
class ComponentDemo extends Component {
  render(){
    return <div> 你好,兄弟... </div>
  }
}

export default ComponentDemo;

5. 根元素个数

import React, { Component } from 'react';

class ComponentDemo extends Component {
  render(){
    // 以下写法直接报错
    return (
      <div>
        hello
      </div>
      <h1> hello h1 </h1>
    );
  }
}

export default ComponentDemo;

React只有一个限制, 组件只能渲染单个根节点。如果你想要返回多个节点,它们必须被包含在同一个节点里。

6. 嵌入变量

{}花括号内可以写JS逻辑,表达式和方法定义都可以

let person = <Person name={window.isLoggedIn ? window.name : ''} />;

7. styles

import React, { Component } from 'react';

class StyleDemo extends Component {
  render(){
    // 5. 在JS文件里面给组件定义样式
    var MyComponentStyles = {
        color: 'blue',
        fontSize: '28px'
    };

    return (
      <div style={MyComponentStyles}>
          可以直接这样写行内样式
      </div>
    )
  }
}

export default StyleDemo;

8. JSX SPREAD

可以通过 {...obj} 来批量设置一个对象的键值对到组件的属性

import React, { Component } from 'react';

class SpreadDemo extends Component {
  componentWillMount(){
    console.log(this.props);
  }
  render(){
    return <h1> {this.props.name} is a {this.props.type} </h1>;
  }
}

export default SpreadDemo;

9. 属性名不能和 js 关键字冲突

例如:className readOnly htmlfor

results matching ""

    No results matching ""