美文网首页
React入门系列教程(二)使用JSX代替React.creat

React入门系列教程(二)使用JSX代替React.creat

作者: du1dume | 来源:发表于2019-03-07 01:57 被阅读0次

上文提到在页面上显示文字信息,直接用html标签不就行了,用js大材小用了。原生环境下当然可以,React呢?没问题,那就是JSX。啥是JSX?就是用html标签的形式实现js语句的功能。

让我们看看如下代码能不能用

<div id="rootElement"></div>
<script src="https://unpkg.com/react@16.8.3/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@16.8.3/umd/react-dom.production.min.js"></script>
<script type="text/javascript">
    const rootElement = document.getElementById('rootElement')
    /*JSX的写法,创建div元素, 设置className属性,文字内容(children属性)*/
    const divElement = <div className="container">du1dume</div>
    ReactDOM.render(divElement, rootElement)
</script>

确实不能用,如图1所示,语法错!

图1

当然语法错,这压根儿就不是js的语法啊,得把这段代码翻译成正确的js语法,也就是把它翻译成React.createElement方法调用。谁来帮你翻译,Babel!通常做正经的项目我们得需要Webpack之类的构建库来帮我们把JSX预编译成js代码,这里我们主要是学习看效果,所以直接在浏览里使用Babel独立版动态编译就好了。看下面的代码:

<div id="rootElement"></div>
<script src="https://unpkg.com/react@16.8.3/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@16.8.3/umd/react-dom.production.min.js"></script>
<!-- 这里引入了babel库,注意路径是babel-standalone -->
<script src="https://unpkg.com/babel-standalone@6.26.0/babel.min.js"></script>
<!-- 这里把原来的type="text/javascript"改成了type="text/babel" -->
<script type="text/babel">
    const rootElement = document.getElementById('rootElement')
    const divElement = <div className="container">du1dume</div>
    ReactDOM.render(divElement, rootElement)
</script>

保存,刷新,完美!

现在文字内容是写死的,如果我们想动态的设置文字内容咋整呢?那就把文字内容放进一个变量里呗,那JSX中如何使用一个变量呢?看代码:

<div id="rootElement"></div>
<script src="https://unpkg.com/react@16.8.3/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@16.8.3/umd/react-dom.production.min.js"></script>
<!-- 这里引入了babel库,注意路径是babel-standalone -->
<script src="https://unpkg.com/babel-standalone@6.26.0/babel.min.js"></script>
<!-- 这里把原来的type="text/javascript"改成了type="text/babel" -->
<script type="text/babel">
    const rootElement = document.getElementById('rootElement')
    /*存入变量*/
    const content = 'du1dume'
    /*使用大括号显示变量内容*/
    const divElement = <div className="container">{content}</div>
    ReactDOM.render(divElement, rootElement)
</script>

对头,就是用大括号,在JSX中使用大括号,可以让我们脱离JSX宇宙,立即跳跃进js宇宙。

既然大括号里是js宇宙范畴了,那我们就可以在里面干js可以干的事儿了,看代码:

<div id="rootElement"></div>
<script src="https://unpkg.com/react@16.8.3/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@16.8.3/umd/react-dom.production.min.js"></script>
<!-- 这里引入了babel库,注意路径是babel-standalone -->
<script src="https://unpkg.com/babel-standalone@6.26.0/babel.min.js"></script>
<!-- 这里把原来的type="text/javascript"改成了type="text/babel" -->
<script type="text/babel">
    const rootElement = document.getElementById('rootElement')
    const content = 'du1dume'

    /*我们在大括号里干了js小时候最爱干的事儿,立即执行函数,这里用了箭头函数*/
    const divElement = <div className="container">{ (() => content)() }</div>
    
    ReactDOM.render(divElement, rootElement)
</script>

这也太牛x了吧!我们可以在两个宇宙中来回穿梭!

我们知道在JSX标签中间书写文字内容就是设置children属性的简写方式,既然children属性可以使用动态方式,其他属性当然也可以,比如className属性,同样是把具体内容放入变量,使用的时候用大括号括起来即可,看代码:

<div id="rootElement"></div>
<script src="https://unpkg.com/react@16.8.3/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@16.8.3/umd/react-dom.production.min.js"></script>
<!-- 这里引入了babel库,注意路径是babel-standalone -->
<script src="https://unpkg.com/babel-standalone@6.26.0/babel.min.js"></script>
<!-- 这里把原来的type="text/javascript"改成了type="text/babel" -->
<script type="text/babel">
    const rootElement = document.getElementById('rootElement')
    const content = 'du1dume'
    
    /*className属性的值,放入clsName变量中*/
    const clsName = 'container'
    
    const divElement = <div className={clsName}>{ (() => content)() }</div>
    
    ReactDOM.render(divElement, rootElement)
</script>

这样我们就可以动态地设置页面上内容的样式,轻易地实现各种效果了。

上文我们提到过,React创建出来的元素都有一个重要的props属性,这个属性是个对象,里面存放了该元素的配置信息。在JSX中,我们可以使用类似jsspread语法来让代码可读性更高。

<div id="rootElement"></div>
<script src="https://unpkg.com/react@16.8.3/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@16.8.3/umd/react-dom.production.min.js"></script>
<!-- 这里引入了babel库,注意路径是babel-standalone -->
<script src="https://unpkg.com/babel-standalone@6.26.0/babel.min.js"></script>
<!-- 这里把原来的type="text/javascript"改成了type="text/babel" -->
<script type="text/babel">
    const rootElement = document.getElementById('rootElement')
  
    /*props对象,配置元素各项属性*/
    const props = {
        className: 'container',
        children: 'du1dume'
    }
    
    /*类似js的spread语法 */
    const divElement = <div {...props} />
    
    ReactDOM.render(divElement, rootElement)
</script>

如果我们既直接配置了属性,也通过传递props对象配置了该属性,会出现什么情况呢?

<div id="rootElement"></div>
<script src="https://unpkg.com/react@16.8.3/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@16.8.3/umd/react-dom.production.min.js"></script>
<!-- 这里引入了babel库,注意路径是babel-standalone -->
<script src="https://unpkg.com/babel-standalone@6.26.0/babel.min.js"></script>
<!-- 这里把原来的type="text/javascript"改成了type="text/babel" -->
<script type="text/babel">
    const rootElement = document.getElementById('rootElement')
  
    const clsName = 'myContainer'
  
    const props = {
        className: 'container',
        children: 'du1dume'
    }
    
    /*既直接配置了className属性,又用props对象设置了该属性,规则就是最后一个设置生效*/
    const divElement = <div className={clsName} {...props} />
    
    ReactDOM.render(divElement, rootElement)
</script>

总之记得在JSX语法中,大括号内是js

相关文章

网友评论

      本文标题:React入门系列教程(二)使用JSX代替React.creat

      本文链接:https://www.haomeiwen.com/subject/bjqqpqtx.html