关于React组件

渲染React组件

通过ReactDOM直接渲染

ReactDOM.render(
  <span>Hello World!</span>,
  document.getElementById('example')
);

通过React.Component创建组件再通过ReactDOM渲染(推荐方法)

class MyTitle extends React.Component {
    render() {
      return <h1>Hello World</h1>;
    }
  };/*该段表示MyTitle类继承基类React.Component下所有属性及方法*/

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

通过React.createClass创建组件再通过ReactDOM渲染

const MyTitle = React.createClass({
    render () {
    return return <h1>Hello World</h1>;
  }
})/*从 React 0.13 开始,官方推荐使用 ES6 类语法来进行组件的定义*/

关于React组件中的数据传递

通过this.props传参获取数据,React还提供一个refs方式用来获取真实的DOM结点

/*this.props*/
class MyTitle extends React.Component {
    render() {
      return <h1 style={{color: this.props.color}}>Hello World</h1>;
    }
  };

  ReactDOM.render(
    <MyTitle color="red" />,
    document.getElementById('example')
  );
/*this.refs*/
var MyTitle = 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(
  <MyTitle />,
  document.getElementById('example')
);

每个组件都有她自身的内部状态,这边是this.state,React在ES6的实现中去掉了getInitialState这个hook函数,规定state在constructor中实现

class MyTitle extends React.Component {
    constructor(...args) {/*组件构造函数*/
      super(...args);
      this.state = {
        name: '访问者'/*定义初始状态*/
      };
    }/*定义一个组件*/

    handleChange(e) {
      let name = e.target.value;
      this.setState({
        name: name
      });
    }

    render() {
      return <div>{/*.bind(this)表示该方法内部的this绑定当前组件*/}
        <input type="text" onChange={this.handleChange.bind(this)} />
      {/*当onChange时调用handleChange事件重新渲染组件*/}
        <p>你好,{this.state.name}</p>
      </div>;
    }
  };

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

React本身为组件不同的生命阶段提供了不同的钩子方法(钩子方法简单来说就是一些运行在特定的某一状态前后的方法),可以利用这些方法

componentWillMount() /*组件加载前*/
componentDidMount() /*组件加载后(一般在此时发出Ajax请求)*/
componentWillUpdate() /*组件更新前*/
componentDidUpdate() /*组件更新后*/
componentWillUnmount() /*组件卸载前*/
componentWillReceiveProps() /*组件接受新的参数时*/

最后是Ajax请求,React组件中的Ajax请求一般在组件生命周期中的componentDidMount发出

class MyList extends React.Component {
    constructor(...args) {
      super(...args);
      this.state = {
        loading: true, /*设置初始state*/
        error: null,
        data: null
      };
    }

    componentDidMount() {
      const url = 'https://api.github.com/search/repositories?q=javascript&sort=stars';/*调用api*/
      $.getJSON(url)
       .done(
        (value) => this.setState({
          loading: false,
          data: value/*把获取的数据value装载到data中*/
        })
      ).fail(
        (jqXHR, textStatus) => this.setState({
          loading: false,
          error: jqXHR.status/*一旦失败的话就装载error*/
        })
      );
    }

    render() {
      if (this.state.loading) {
        return <span>Loading...</span>;
      } else if (this.state.error !== null) {
        return <span>Error: {this.state.error}</span>;
      } else {
        console.log(this.state.data);/*先输出到控制台查看数据结构*/
        /*处理数据*/
        var projects = this.state.data.items;
        var results = [];
        projects.forEach(p => {
          var item = <li>{p.name}</li>;
            results.push(item);
        });
        return (
          <div>
            <p>API 数据获取成功</p>
            <ul>{results}</ul>
          </div>
        );
      }
    }
  };

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

关于React组件的嵌套

React组件的思想很简单,就是用一个组件装载其他组件,这便是组件的嵌套

/*装载组件*/
var Avatar =React.createClass({
  render: function() {
    return (
      <div>
        <ProfilePicusername={this.props.username} />
        <ProfileLinkusername={this.props.username} />
      </div>
    );
  }
});
/*子组件*/
var ProfilePic =React.createClass({
  render: function() {
    return (
      <img src={'http://graph.facebook.com/'+ this.props.username + '/picture'} />
    );
  }
});
 
var ProfileLink =React.createClass({
  render: function() {
    return (
      <a href={'http://www.facebook.com/' +this.props.username}>
        {this.props.username}
      </a>
    );
  }
});
/*渲染装载组件*/
React.render(
  <Avatar username="pwh" />,
  document.getElementById('example')
);

高阶组件

高阶组件就是返回组件的组件,她可以在不修改原组件的前提下,修改或增强原组件的行为

function noId() {
  return function(Comp) { /*返回一个接收组件的函数*/
    return class NoID extends Component { /*该函数返回一个组件*/
     render() {
        const {id, ...others} = this.props
        return (
          <Comp {..others} />
        )
      }
    }
  }
}
const WithoutID = noId()(Comp)

propTypes

用于检查组件的数据类型是否准确

MyElysion.propTypes ={
    El: PropTypes.string.isRequired,
    Elys: PropTypes.array.isRequired,
    Elysion: PropTypes.func.isRequired
}

未完待续

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

推荐阅读更多精彩内容