博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
初识React
阅读量:5145 次
发布时间:2019-06-13

本文共 6296 字,大约阅读时间需要 20 分钟。

原文地址:

专注于UI

在MVC分层设计模式中,react常被拿来实现视图层(V)。

React不依赖于技术栈的其他部分,因此可以方便的在现有项目中尝试用它来实现一个小特性。

虚拟DOM

React从DOM中抽象出来,给出一种更简洁的编程模型,且性能表现更好。能够通过NodeJS实现服务端渲染,通过React Native开发原生app。

数据流

React实现单向、响应式数据流,减少boilerplate且比传统数据绑定更容易理解。

简洁的组件

React的组件都实现了一个render()方法,它接收输入的数据并返回要显示的内容。这个例子中我们使用JSX(类XML语法)来编写代码。render()方法通过this.props属性来访问输入的数据。

React并不强制要求开发者使用JSX。在“编译的JS”中可以查看JSX生成的原始Javascript代码。

// JSX codevar HelloMessage = React.createClass({    render: function() {        return 
Hello {this.props.name}
; }});React.render(
, mountNode); // compiled javascript codevar HelloMessage = React.createClass({displayName: "HelloMessage", render: function() { return React.createElement("div", null, "Hello ", this.props.name); }});React.render(React.createElement(HelloMessage, {name: "John"}), mountNode);

带状态的组件

除了可以通过this.props访问输入数据之外,组件还可以通过this.state来维持他的内部状态数据。当一个组件的状态数据改变时,组件将重新调用render()方法来重绘。

// JSX codevar Timer = React.createClass({    getInitialState: function() {        return {secondsElapsed: 0};    },    tick: function() {        this.setState({secondsElapsed: this.state.secondsElapsed + 1});    },    componentDidMount: function() {        this.interval = setInterval(this.tick, 1000);    },    componentWillUnmount: function() {        clearInterval(this.interval);    },    render: function() {        return (            
Seconds Elapsed: {this.state.secondsElapsed}
); }});React.render(
, mountNode); // compiled javascript codevar Timer = React.createClass({displayName: "Timer", getInitialState: function() { return {secondsElapsed: 0}; }, tick: function() { this.setState({secondsElapsed: this.state.secondsElapsed + 1}); }, componentDidMount: function() { this.interval = setInterval(this.tick, 1000); }, componentWillUnmount: function() { clearInterval(this.interval); }, render: function() { return ( React.createElement("div", null, "Seconds Elapsed: ", this.state.secondsElapsed) ); }});React.render(React.createElement(Timer, null), mountNode);

React应用

结合使用属性(props)和状态(state),可以构建一个基础的代办事项应用。这个例子中使用状态来跟踪事项列表和用户输入的新事项名称,即使事件处理程序看起来是内联的,他们仍将会通过代理被收集和实现。

// JSX codevar TodoList = React.createClass({    render: function() {        var createItem = function(itemText, index) {            return 
  • {itemText}
  • ; }; return
      {this.props.items.map(createItem)}
    ; }});var TodoApp = React.createClass({ getInitialState: function() { return {items: [], text: ''}; }, onChange: function(e) { this.setState({text: e.target.value}); }, handleSubmit: function(e) { e.preventDefault(); var nextItems = this.state.items.concat([this.state.text]); var nextText = ''; this.setState({items: nextItems, text: nextText}); }, render: function() { return (

    TODO

    ); }});React.render(
    , mountNode); // compiled javascript codevar TodoList = React.createClass({displayName: "TodoList", render: function() { var createItem = function(itemText, index) { return React.createElement("li", {key: index + itemText}, itemText); }; return React.createElement("ul", null, this.props.items.map(createItem)); }}); var TodoApp = React.createClass({displayName: "TodoApp", getInitialState: function() { return {items: [], text: ''}; }, onChange: function(e) { this.setState({text: e.target.value}); }, handleSubmit: function(e) { e.preventDefault(); var nextItems = this.state.items.concat([this.state.text]); var nextText = ''; this.setState({items: nextItems, text: nextText}); }, render: function() { return ( React.createElement("div", null, React.createElement("h3", null, "TODO"), React.createElement(TodoList, {items: this.state.items}), React.createElement("form", {onSubmit: this.handleSubmit}, React.createElement("input", {onChange: this.onChange, value: this.state.text}), React.createElement("button", null, 'Add #' + (this.state.items.length + 1)) ) ) ); }});React.render(React.createElement(TodoApp, null), mountNode);

    组件可以使用第三方插件

    React非常灵活,通过钩子允许与其他的库和框架对接。这个例子使用外部的Markdown库来实时转化文本域中的内容。

     

    // JSX codevar MarkdownEditor = React.createClass({    getInitialState: function() {        return {value: 'Type some *markdown* here!'};    },    handleChange: function() {        this.setState({value: React.findDOMNode(this.refs.textarea).value});    },    render: function() {        return (            

    Input

    Output

    ); }});React.render(
    , mountNode); // compiled javascript codevar MarkdownEditor = React.createClass({displayName: "MarkdownEditor", getInitialState: function() { return {value: 'Type some *markdown* here!'}; }, handleChange: function() { this.setState({value: React.findDOMNode(this.refs.textarea).value}); }, render: function() { return ( React.createElement("div", {className: "MarkdownEditor"}, React.createElement("h3", null, "Input"), React.createElement("textarea", { onChange: this.handleChange, ref: "textarea", defaultValue: this.state.value }), React.createElement("h3", null, "Output"), React.createElement("div", { className: "content", dangerouslySetInnerHTML: { __html: marked(this.state.value, {sanitize: true}) } }) ) ); }});React.render(React.createElement(MarkdownEditor, null), mountNode);

     

    转载于:https://www.cnblogs.com/Betree/p/learn-react.html

    你可能感兴趣的文章
    Kettle学习系列之Kettle能做什么?(三)
    查看>>
    ExtJS 4.2 业务开发(一)主页搭建
    查看>>
    webpack Import 动态文件
    查看>>
    电脑没有安装iis,但是安装了.NET环境,如何调试网站发布的程序
    查看>>
    【Mac + GitHub】之在另一台Mac电脑上下载GitHub的SSH链接报错
    查看>>
    GDAL VC6.0 (1)
    查看>>
    java 随笔
    查看>>
    (转) objective-C中的接口@interface与泛型(id)
    查看>>
    Asp.Net缓存(2)
    查看>>
    Day03:Selenium,BeautifulSoup4
    查看>>
    Java NIO系列教程(九) ServerSocketChannel
    查看>>
    awk变量
    查看>>
    mysql_对于DQL 的简单举例
    查看>>
    postgis几何操作函数集
    查看>>
    js用blob处理ajax请求的流文件
    查看>>
    ACM题目————还是畅通工程
    查看>>
    Cheerleaders UVA - 11806
    查看>>
    同步的数据过大,导致shareplex超时,并自动kill掉了同步会话
    查看>>
    数据挖掘十大算法--K-均值聚类算法
    查看>>
    Python实现QQ自动点赞
    查看>>