沙漠中的那片海 發表於 2019-5-29 10:38:00

前端笔记之React(一)初识React&组件&JSX语法

<h1>一、<strong>React<span style="font-family: 宋体">项目起步</span><span style="font-family: 宋体">配置</span></strong></h1>
<p>官网:<span style="text-decoration: underline">https://reactjs.org/</span></p>
<p>文档:<span style="text-decoration: underline">https://reactjs.org/docs/hello-world.html</span></p>
<p>中文:<span style="text-decoration: underline">http://react.css88.com/</span></p>
<p>2013<span style="font-family: 宋体">年被开源,</span><span style="font-family: Consolas">2014</span><span style="font-family: 宋体">年在中国彻底火爆。</span></p>
<p><strong>&nbsp;</strong></p>
<p><strong>React<span style="font-family: 宋体">是</span><span style="font-family: Consolas">CMD</span><span style="font-family: 宋体">架构,现阶段需要</span><span style="font-family: Consolas">webpack</span><span style="font-family: 宋体">打包</span></strong></p>
<div class="cnblogs_code">
<pre>npm install -g <span style="color: rgba(255, 0, 0, 1)">webpack@4.9.1</span></pre>
</div>
<p>必须安装以下三个依赖:</p>
<div class="cnblogs_code">
<pre>npm install --save-dev<span style="color: rgba(255, 0, 0, 1)"> babel-core babel-loader</span> <span style="color: rgba(255, 0, 0, 1)">babel-preset-env</span></pre>
</div>
<p>&nbsp;</p>
<p><strong>React<span style="font-family: 宋体">采用</span><span style="font-family: Consolas">jsx</span><span style="font-family: 宋体">语法,</span><span style="font-family: Consolas">JSX</span><span style="font-family: 宋体">语法是什么?</span></strong></p>
<p><span style="font-family: 宋体">就是全球唯一标准的</span>JavaScript<span style="font-family: 宋体">和</span><span style="font-family: Consolas">XHTML</span><span style="font-family: 宋体">结合开发最优雅的语法。</span></p>
<p><span style="font-family: 宋体">浏览器不识别</span>JSX<span style="font-family: 宋体">语法,所以需要</span><span style="font-family: Consolas">babel</span><span style="font-family: 宋体">将</span><span style="font-family: Consolas">JSX</span><span style="font-family: 宋体">语法翻译,</span><span style="font-family: Consolas">babel</span><span style="font-family: 宋体">要装一个新的</span><span style="font-family: Consolas">preset</span></p>
<div class="cnblogs_code">
<pre>npm install --save-dev<span style="color: rgba(255, 0, 0, 1)"> babel-preset-react</span></pre>
</div>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">安装完依赖,修改</span>webpack.congif.js<span style="font-family: 宋体">文件中的</span><span style="font-family: Consolas">preset</span><span style="font-family: 宋体">配置:</span></p>
<div class="cnblogs_code">
<pre>const path = require('path'<span style="color: rgba(0, 0, 0, 1)">);
module.exports </span>=<span style="color: rgba(0, 0, 0, 1)"> {
    entry: </span>"./www/app/main"<span style="color: rgba(0, 0, 0, 1)">,
    output : {
      path: path.resolve(__dirname, </span>"www/dist"<span style="color: rgba(0, 0, 0, 1)">),
      filename : </span>"bundle.js"<span style="color: rgba(0, 0, 0, 1)">,
    },
    watch:</span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
    mode : </span>"development"<span style="color: rgba(0, 0, 0, 1)">,
    module: {
      rules: [
            {
                test: </span>/\.js?$/<span style="color: rgba(0, 0, 0, 1)">,
                include: ,
                exclude: ,
                loader : </span>"babel-loader"<span style="color: rgba(0, 0, 0, 1)">,
                options: { <span style="color: rgba(255, 0, 0, 1)">presets: [</span></span><span style="color: rgba(255, 0, 0, 1)">"env","react"]</span> }, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">要翻译的语法 </span>
<span style="color: rgba(0, 0, 0, 1)">            }
      ]
    }
}</span></pre>
</div>
<p><span style="font-family: 宋体">还要安装</span>react<span style="font-family: 宋体">和</span><span style="font-family: Consolas">react-dom</span><span style="font-family: 宋体">包:</span></p>
<div class="cnblogs_code">
<pre>npm install --save <span style="color: rgba(255, 0, 0, 1)">react</span> <span style="color: rgba(255, 0, 0, 1)">react-dom</span></pre>
</div>
<p>&nbsp;react<span style="font-family: 宋体">是核心库</span></p>
<p>&nbsp;react-dom<span style="font-family: 宋体">提供了与</span><span style="font-family: Consolas">DOM</span><span style="font-family: 宋体">操作的功能库</span></p>
<p align="justify"><span style="color: rgba(255, 0, 0, 1)"><strong><span style="font-family: 宋体">注意:项目文件夹名字千万不要叫</span>react<span style="font-family: 宋体">,很坑。</span></strong></span></p>
<p align="justify"><strong>&nbsp;</strong></p>
<p align="justify"><span style="font-family: 宋体">在</span>index.html<span style="font-family: 宋体">上放“挂载点”的盒子:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;!</span><span style="color: rgba(255, 0, 255, 1)">DOCTYPE html</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">html </span><span style="color: rgba(255, 0, 0, 1)">lang</span><span style="color: rgba(0, 0, 255, 1)">="en"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">meta </span><span style="color: rgba(255, 0, 0, 1)">charset</span><span style="color: rgba(0, 0, 255, 1)">="UTF-8"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>Document<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(255, 0, 0, 1)">&lt;div id="app"&gt;&lt;/div&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(255, 0, 0, 1)">&lt;script type="text/javascript" src="dist/bundle.js"&gt;&lt;/script&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">html</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p>&nbsp;</p>
<p>app/main.js</p>
<div class="cnblogs_code"><img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_a49612bb-d46f-4c9e-abdd-4c8b131f1a82" class="code_img_opened lazyload" style="display: none" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_a49612bb-d46f-4c9e-abdd-4c8b131f1a82" class="cnblogs_code_hide">
<pre>import React from "react"<span style="color: rgba(0, 0, 0, 1)">;
import ReactDOM from </span>"react-dom"<span style="color: rgba(0, 0, 0, 1)">;

ReactDOM.render(
    </span>&lt;div&gt;
      &lt;h1&gt;你好,我是react,来自Facebook公司&lt;/h1&gt;
    &lt;/div&gt;,
    document.getElementById('app'<span style="color: rgba(0, 0, 0, 1)">)
);</span></pre>
</div>
<span class="cnblogs_code_collapse">示例代码</span></div>
<p><span style="font-family: 宋体">运行</span>webpack<span style="font-family: 宋体">,直接打开页面:</span></p>
<p><strong><img alt="" data-src="https://img2018.cnblogs.com/blog/1491596/201904/1491596-20190420134515947-1285821679.png"></strong></p>
<p>&nbsp;React<span style="font-family: 宋体">是所有</span><span style="font-family: Consolas">react</span><span style="font-family: 宋体">项目的入口</span></p>
<p>&nbsp;React-dom<span style="font-family: 宋体">负责</span><span style="font-family: Consolas">react Element</span><span style="font-family: 宋体">添加到</span><span style="font-family: Consolas">HTML</span><span style="font-family: 宋体">页面的挂载点上</span></p>
<p>&nbsp;</p>
<p>react-dom <span style="font-family: 宋体">这个包提供了你的</span>app<span style="font-family: 宋体">最高等级的</span><span style="font-family: Consolas">API</span><span style="font-family: 宋体">,提供了元素的挂载和上树的方法</span></p>
<p>render() <span style="font-family: 宋体">接收两个参数,第一个参数是</span>react<span style="font-family: 宋体">元素,第二个参数是挂载点,用来让</span><span style="font-family: Consolas">react</span><span style="font-family: 宋体">元素进行挂载。</span></p>
<p>&nbsp;</p>
<p>Vue<span style="font-family: 宋体">在写实例,而</span><span style="font-family: Consolas">React</span><span style="font-family: 宋体">在写类(构造函数)。</span></p>
<hr>
<h1>二、<strong>组件</strong></h1>
<p><span style="font-family: 宋体">组件叫</span>“<span style="font-family: Consolas">component</span><span style="font-family: 宋体">”,就是</span><span style="font-family: Consolas">HTML</span><span style="font-family: 宋体">、</span><span style="font-family: Consolas">CSS</span><span style="font-family: 宋体">和</span><span style="font-family: Consolas">JS</span><span style="font-family: 宋体">行为的一个封装。</span></p>
<p>Vue<span style="font-family: 宋体">中的组件是一个</span><span style="font-family: Consolas">.vue</span><span style="font-family: 宋体">文件(其实是普通的</span><span style="font-family: Consolas">JSON</span><span style="font-family: 宋体">对象),</span><span style="font-family: Consolas">React</span><span style="font-family: 宋体">中,组件是一个类(构造函数)。</span></p>
<h2><strong>2.1<span style="font-family: 宋体">类式组件</span></strong></h2>
<p><span style="font-family: 宋体">创建</span>App.js<span style="font-family: 宋体">文件,这是一个组件,必须按照要求写标准壳,这个壳我们叫</span><span style="font-family: Consolas">rcc</span><span style="font-family: 宋体">壳“</span><span style="font-family: Consolas">react class component</span><span style="font-family: 宋体">”,</span><span style="font-family: Consolas">react</span><span style="font-family: 宋体">的类式组件:</span></p>
<div class="cnblogs_code">
<pre>import React from "react"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 默认暴露一个构造函数(类组件)</span>
export <span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class <span style="color: rgba(255, 0, 0, 1)">App</span> extends <span style="color: rgba(255, 0, 0, 1)">React.Component</span>{
    constructor(){
      super();
    }
    render(){
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> &lt;div&gt;
            &lt;h1&gt;我是App组件!&lt;/h1&gt;
      &lt;/div&gt;
<span style="color: rgba(0, 0, 0, 1)">    }
}</span></pre>
</div>
<p>&nbsp;</p>
<p>注意:</p>
<div class="cnblogs_code">
<pre>1<span style="color: rgba(0, 0, 0, 1)">)这个文件的默认暴露就是一个类,这个类的类名必须和文件名相同。
</span>2<span style="color: rgba(0, 0, 0, 1)">)文件名和类名的首字母必须大写!React中组件的合法名字首字母必须是大写字母。
</span>3<span style="color: rgba(0, 0, 0, 1)">)这个类必须继承自React.Component类,也就是说,rcc壳必须是extends React.Component的写法。
</span>4<span style="color: rgba(0, 0, 0, 1)">)这个类必须有构造器constructor,构造器里面必须调用超类的构造器,super();
</span>5)这个类必须有render函数,render函数中必须return一个jsx对象。而且这个jsx对象必须被唯一的标签包裹。</pre>
</div>
<p>&nbsp;</p>
<p>在main.js<span style="font-family: 宋体">主文件中引入组件,然后用自定义标签:</span></p>
<div class="cnblogs_code">
<pre>import React from "react"<span style="color: rgba(0, 0, 0, 1)">;
import ReactDOM from </span>"react-dom"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 引入组件</span>
<span style="color: rgba(255, 0, 0, 1)">import App from "./App.js"</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)">;</span>

ReactDOM.render(
    </span>&lt;div&gt;
       <span style="color: rgba(255, 0, 0, 1)"> &lt;App&gt;&lt;/App&gt;</span>
      &lt;h1&gt;你好,我是react,来自Facebook公司&lt;/h1&gt;
    &lt;/div&gt;,
    document.getElementById("app"<span style="color: rgba(0, 0, 0, 1)">)
);</span></pre>
</div>
<p>注意:</p>
<p><span style="font-family: 宋体">引入的组件必须路径以</span>./<span style="font-family: 宋体">开头</span></p>
<p>组件要使用,就将这个组件的名字(类名、文件名)进行标签化即可</p>
<p><span style="color: rgba(255, 0, 0, 1)"><strong><span style="font-family: 宋体">原理就是这个</span>App<span style="font-family: 宋体">类在被实例化。</span></strong></span></p>
<p>因为类的名字是大写字母,所以所有的自定义组件标签名字一定是大写字母开头的</p>
<p><span style="font-family: 宋体">在</span>react<span style="font-family: 宋体">中,所有以大写字母开头的都是组件,而不是标签。</span></p>
<p><span style="color: rgba(255, 0, 0, 1)">&nbsp;</span></p>
<p class="16"><span style="color: rgba(255, 0, 0, 1)"><strong>ReactDOM.render(<span style="font-family: 宋体">根</span><span style="font-family: Consolas">jsx</span><span style="font-family: 宋体">,根的挂载点</span><span style="font-family: Consolas">)</span></strong></span></p>
<p><span style="color: rgba(255, 0, 0, 1)"><strong>ReactDOM<span style="font-family: 宋体">只能出现一次,但是非常厉害,可以和</span><span style="font-family: Consolas">HTML</span><span style="font-family: 宋体">结合</span></strong></span></p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/blog/1491596/201904/1491596-20190420134651703-1360427325.png"></p>
<p>jsx<span style="font-family: 宋体">,现在一律在</span><span style="font-family: Consolas">js</span><span style="font-family: 宋体">文件夹中开发,并不是传统放</span><span style="font-family: Consolas">html</span><span style="font-family: 宋体">开发</span></p>
<p>HTML<span style="font-family: 宋体">、</span><span style="font-family: Consolas">CSS</span><span style="font-family: 宋体">、</span><span style="font-family: Consolas">JS</span><span style="font-family: 宋体">都被构建到</span><span style="font-family: Consolas">bundle.js</span><span style="font-family: 宋体">文件夹中。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">安装以下插件,输入</span>rcc<span style="font-family: 宋体">即可快速生成一个组件的语法:</span></p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/blog/1491596/201904/1491596-20190420134700488-1135059621.png"></p>
<hr>
<h2><strong>2.2<span style="font-family: 宋体">组件可以多层嵌套</span></strong></h2>
<p>main.js<span style="font-family: 宋体">文件中引入</span><span style="font-family: Consolas">App.js</span><span style="font-family: 宋体">组件,</span><span style="font-family: Consolas">App</span><span style="font-family: 宋体">组件里面的</span><span style="font-family: Consolas">render</span><span style="font-family: 宋体">函数还可以引入其他组件。</span></p>
<p>components/Child.js</p>
<div class="cnblogs_code">
<pre>import React from "react"<span style="color: rgba(0, 0, 0, 1)">;
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class <span style="color: rgba(255, 0, 0, 1)">Child</span> extends React.Component {
    constructor() {
      super();
    }
    render() {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> &lt;div&gt;
            &lt;h1&gt;我是Child子组件!&lt;/h1&gt;
      &lt;/div&gt;
<span style="color: rgba(0, 0, 0, 1)">    }
}</span></pre>
</div>
<p>&nbsp;</p>
<p>App<span style="font-family: 宋体">父组件中引入:</span></p>
<div class="cnblogs_code">
<pre>import React from "react"<span style="color: rgba(0, 0, 0, 1)">;
<span style="color: rgba(255, 0, 0, 1)">import Child from </span></span><span style="color: rgba(255, 0, 0, 1)">"./components/Child";
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 默认暴露一个构造函数(类组件)</span>
export <span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class App extends React.Component {
    constructor() {
      super();
    }
    render() {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> &lt;div&gt;
            &lt;h1&gt;我是App组件!&lt;/h1&gt;
            &lt;Child&gt;&lt;/Child&gt;
            &lt;Child&gt;&lt;/Child&gt;
            &lt;Child&gt;&lt;/Child&gt;
      &lt;/div&gt;
<span style="color: rgba(0, 0, 0, 1)">    }
}</span></pre>
</div>
<p><span style="font-family: 宋体">简单的说:在</span>react<span style="font-family: 宋体">中做一个组件:</span></p>
<p>第一步:创建一个类并暴露</p>
<p>第二步:引入这个类,然后用这个类的类名当做组件的标签(实例化)</p>
<hr>
<h2><strong>2.3<span style="font-family: 宋体">函数式组件</span></strong></h2>
<p><span style="font-family: 宋体">一个函数,如果是大写字母开头,并且</span>return<span style="font-family: 宋体">一个</span><span style="font-family: Consolas">React Element</span><span style="font-family: 宋体">就是一个组件。</span></p>
<p><span style="font-family: 宋体">比如</span>App.js<span style="font-family: 宋体">组件中,创建一个</span><span style="font-family: Consolas">Child1</span><span style="font-family: 宋体">的函数,这个函数直接返回</span><span style="font-family: Consolas">JSX</span><span style="font-family: 宋体">语法的</span><span style="font-family: Consolas">React Element</span><span style="font-family: 宋体">,此时这个函数就是组件,这个函数直接成为自定义标签,就可以用了。</span></p>
<div class="cnblogs_code">
<pre>import React from "react"<span style="color: rgba(0, 0, 0, 1)">;
import Child from </span>"./components/Child"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 默认暴露一个构造函数(类组件)</span>

<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义一个自定义的函数组件</span>
<span style="color: rgba(255, 0, 0, 1)">const Child1 = ()=&gt; &lt;div&gt;
    &lt;h1&gt;我是Child1函数式组件!&lt;/h1&gt;
&lt;/div&gt;</span>
<span style="color: rgba(0, 0, 0, 1)">
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class App extends React.Component {
    constructor() {
      super();
    }
    render() {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> &lt;div&gt;
            &lt;h1&gt;我是App组件!&lt;/h1&gt;
            &lt;Child&gt;&lt;/Child&gt;
         <span style="color: rgba(255, 0, 0, 1)"> &lt;Child1&gt;&lt;/Child1&gt;</span>
      &lt;/div&gt;
<span style="color: rgba(0, 0, 0, 1)">    }
}</span></pre>
</div>
<p>注意:</p>
<p>1<span style="font-family: 宋体">)</span><span style="font-family: Consolas">render</span><span style="font-family: 宋体">是一个函数,所以函数里面当然可以定义另一个函数。我们用</span><span style="font-family: Consolas">const</span><span style="font-family: 宋体">来定义一个箭头函数,这个箭头函数的名字,必须首字母大写。</span><span style="font-family: Consolas">react</span><span style="font-family: 宋体">中所有标签名字是首字母大写的,将被判定为我们自己的组件。</span></p>
<p>2<span style="font-family: 宋体">)这个函数里面</span><span style="font-family: Consolas">return</span><span style="font-family: 宋体">了一个</span><span style="font-family: Consolas">jsx</span><span style="font-family: 宋体">对象,注意,不要加引号。初学者会有很多不适。</span></p>
<p>3<span style="font-family: 宋体">)这个组件也是通过“标签”的形式来上树的!</span></p>
<p>4<span style="font-family: 宋体">)函数式组件比类组件差很多功能很多,后面会说。</span></p>
<p>5<span style="font-family: 宋体">)至于什么时候用什么组件、圆括号中能不能传入参数,后面会说。</span></p>
<p>&nbsp;</p>
<p><span style="color: rgba(255, 0, 0, 1)"><strong><span style="font-family: 宋体">函数式组件有个缺点,没有</span>state<span style="font-family: 宋体">,没有生命周期。</span></strong></span></p>
<hr>
<h1>三、<strong>JSX<span style="font-family: 宋体">语法</span></strong></h1>
<p><span style="font-family: 宋体">所有对</span>React<span style="font-family: 宋体">不适应,都是</span><span style="font-family: Consolas">JSX</span><span style="font-family: 宋体">语法造成的,</span><span style="font-family: Consolas">JSX</span><span style="font-family: 宋体">语法淡化了</span><span style="font-family: Consolas">JS</span><span style="font-family: 宋体">和</span><span style="font-family: Consolas">HTML</span><span style="font-family: 宋体">之间的“边界”。</span></p>
<p>&nbsp;</p>
<h2><strong>3.1<span style="font-family: 宋体">标签必须合理嵌套</span></strong></h2>
<p>错误的:</p>
<div class="cnblogs_code">
<pre>import React from "react"<span style="color: rgba(0, 0, 0, 1)">;
import ReactDOM from </span>"react-dom"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 引入组件</span>
import App from "./App.js"<span style="color: rgba(0, 0, 0, 1)">
ReactDOM.render(
    </span><span style="text-decoration: line-through">&lt;App&gt;&lt;/App&gt;
    &lt;App&gt;&lt;/App&gt;
    &lt;App&gt;&lt;/App&gt;</span>
<span style="color: rgba(0, 0, 0, 1)">,
document.getElementById(</span>'app'<span style="color: rgba(0, 0, 0, 1)">)
);</span></pre>
</div>
<p>&nbsp;</p>
<p>有多个组件,必须有一个标签包裹所有组件:</p>
<div class="cnblogs_code">
<pre>import React from "react"<span style="color: rgba(0, 0, 0, 1)">;
import ReactDOM from </span>"react-dom"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 引入组件</span>
import App from "./App.js"<span style="color: rgba(0, 0, 0, 1)">
ReactDOM.render(
</span><span style="color: rgba(255, 0, 0, 1)">&lt;div&gt;
   &lt;App&gt;&lt;/App&gt;
   &lt;App&gt;&lt;/App&gt;
   &lt;App&gt;&lt;/App&gt;
&lt;/div&gt;</span>
<span style="color: rgba(0, 0, 0, 1)">,
document.getElementById(</span>'app'<span style="color: rgba(0, 0, 0, 1)">)
);</span></pre>
</div>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">比如</span>table<span style="font-family: 宋体">不能直接嵌套</span><span style="font-family: Consolas">tr</span><span style="font-family: 宋体">,必须要有</span><span style="font-family: Consolas">tbody</span></p>
<div class="cnblogs_code">
<pre>import React from "react"<span style="color: rgba(0, 0, 0, 1)">;
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class App extends React.Component {
    constructor() {
      super();
    }
    render() {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> &lt;div&gt;
            &lt;table&gt;
               <span style="color: rgba(255, 0, 0, 1)"> &lt;tbody&gt;</span>
                  &lt;tr&gt;
                        &lt;td&gt;1&lt;/td&gt;
                        &lt;td&gt;2&lt;/td&gt;
                  &lt;/tr&gt;
                <span style="color: rgba(255, 0, 0, 1)">&lt;/tbody&gt;</span>
            &lt;/table&gt;
      &lt;/div&gt;
<span style="color: rgba(0, 0, 0, 1)">    }
}</span></pre>
</div>
<p>&nbsp;</p>
<p>比如这样也是错误的:</p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>111<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p><img src="https://img2018.cnblogs.com/blog/1491596/201904/1491596-20190420134958939-1762366989.png"></p>
<hr>
<h2><strong>3.2 return<span style="font-family: 宋体">不能换行</span></strong></h2>
<p>return<span style="font-family: 宋体">后面直接跟着</span><span style="font-family: Consolas">div</span><span style="font-family: 宋体">,不能换行</span></p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/blog/1491596/201904/1491596-20190420135011102-1114976841.png"></p>
<p>&nbsp;</p>
<p>如果想换行,必须加圆括号包裹。</p>
<div class="cnblogs_code">
<pre>import React from "react"<span style="color: rgba(0, 0, 0, 1)">;
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class App extends React.Component {
    constructor() {
      super();
    }
    render() {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(255, 0, 0, 1)"> (
            </span>&lt;div&gt;
                &lt;h1&gt;我是App组件&lt;/h1&gt;
            &lt;/div&gt;
<span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)">      )</span>
    }
}</span></pre>
</div>
<hr>
<h2><strong>3.3<span style="font-family: 宋体">标签必须严格封闭</span></strong></h2>
<p><span style="font-family: 宋体">因为</span>jsx<span style="font-family: 宋体">语法被</span><span style="font-family: Consolas">babel-loader</span><span style="font-family: 宋体">翻译(</span><span style="font-family: Consolas">babel-perset-react</span><span style="font-family: 宋体">),所以标签必须严格封闭,否则翻译会报错。</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">错误的:
</span><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">br</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">hr</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 0, 1)">

正确的:
</span><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">br</span><span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">hr</span><span style="color: rgba(0, 0, 255, 1)">/&gt;</span><span style="color: rgba(0, 0, 0, 1)">

错误的:
</span><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">input </span><span style="color: rgba(255, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">="text"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 0, 1)">

正确的:
</span><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">input </span><span style="color: rgba(255, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">="text"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span></pre>
</div>
<hr>
<h2><strong>3.4<span style="font-family: 宋体">所有的类名必须用</span><span style="font-family: 华文中宋">className</span><span style="font-family: 宋体">表示</span></strong></h2>
<p><span style="font-family: 宋体">因为</span>JS<span style="font-family: 宋体">中</span><span style="font-family: Consolas">class</span><span style="font-family: 宋体">是关键字,所以类名必须用</span><span style="font-family: Consolas">className</span></p>
<p>错误的</p>
<div class="cnblogs_code">
<pre><span style="text-decoration: line-through"><span style="color: rgba(0, 0, 255, 1); text-decoration: line-through">&lt;</span><span style="color: rgba(128, 0, 0, 1); text-decoration: line-through">div </span><span style="color: rgba(255, 0, 0, 1); text-decoration: line-through">class</span><span style="color: rgba(0, 0, 255, 1); text-decoration: line-through">="box"</span><span style="color: rgba(0, 0, 255, 1); text-decoration: line-through">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1); text-decoration: line-through">div</span><span style="color: rgba(0, 0, 255, 1); text-decoration: line-through">&gt;</span></span></pre>
</div>
<p><img src="https://img2018.cnblogs.com/blog/1491596/201904/1491596-20190420135124563-840601137.png"></p>
<p>正确的:</p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">className</span><span style="color: rgba(0, 0, 255, 1)">="box"</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p>&nbsp;</p>
<p>for<span style="font-family: 宋体">要用</span><span style="font-family: Consolas">htmlFor</span><span style="font-family: 宋体">代替:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">错误的:
</span><span style="text-decoration: line-through"><span style="color: rgba(0, 0, 255, 1); text-decoration: line-through">&lt;</span><span style="color: rgba(128, 0, 0, 1); text-decoration: line-through">label </span><span style="color: rgba(255, 0, 0, 1); text-decoration: line-through">for</span><span style="color: rgba(0, 0, 255, 1); text-decoration: line-through">=""</span><span style="color: rgba(0, 0, 255, 1); text-decoration: line-through">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1); text-decoration: line-through">label</span><span style="color: rgba(0, 0, 255, 1); text-decoration: line-through">&gt;</span></span><span style="color: rgba(0, 0, 0, 1)">
正确的:
</span><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">label </span><span style="color: rgba(255, 0, 0, 1)">htmlFor</span><span style="color: rgba(0, 0, 255, 1)">=""</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">label</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<hr>
<h2><strong>3.5<span style="font-family: 宋体">插值基础(重点)</span></strong></h2>
<p><span style="font-family: 宋体">可以在</span>jsx<span style="font-family: 宋体">内部,用单个“</span><span style="font-family: Consolas">{}</span><span style="font-family: 宋体">”大括号进行一些</span><span style="font-family: Consolas">js</span><span style="font-family: 宋体">表达式的插入,我们叫做插值。</span></p>
<p>{} <span style="font-family: 宋体">只能出现在</span><span style="font-family: Consolas">React element</span><span style="font-family: 宋体">中,简化了连字符串工作。</span></p>
<div class="cnblogs_code">
<pre>import React from "react"<span style="color: rgba(0, 0, 0, 1)">;
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class App extends React.Component {
    constructor() {
      super();
    }
    render() {
      <span style="color: rgba(255, 0, 0, 1)">const year </span></span><span style="color: rgba(255, 0, 0, 1)">= 10000;
      const pingfang = (n)=&gt;{
            return n *</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)"> n
      }</span>
       <span style="color: rgba(255, 0, 0, 1)"> const arr </span></span><span style="color: rgba(255, 0, 0, 1)">=
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> &lt;div&gt;
         <span style="color: rgba(255, 0, 0, 1)"> &lt;h1&gt;{5000 * 2}年&lt;/h1&gt;
            &lt;h1&gt;{year}年&lt;/h1&gt;
            &lt;h1&gt;{pingfang(100)}年&lt;/h1&gt;
            &lt;h1&gt;{arr.reduce((a,b)=&gt;a + b)}年&lt;/h1&gt;
            &lt;h1&gt;{parseInt(Math.random() * 100)}年&lt;/h1&gt;
            &lt;h1&gt;{3 &gt; 8 ? 10000 : 1}年&lt;/h1&gt;</span>
      &lt;/div&gt;
<span style="color: rgba(0, 0, 0, 1)">    }
}</span></pre>
</div>
<p>&nbsp;</p>
<p><strong>不能出现的语法:</strong></p>
<p><strong>不能定义变量:</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">h1</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="text-decoration: line-through">{var a = 100}</span><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">h1</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p>不能定义函数:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">h1</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="text-decoration: line-through">{function name(){}}</span><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">h1</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p><span style="font-family: 宋体">应该在</span>return<span style="font-family: 宋体">之前定义:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">render() {
    const pingfang </span>= (n)=&gt; n *<span style="color: rgba(0, 0, 0, 1)"> n
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
      </span>&lt;div&gt;
            &lt;h1&gt;我爱你{pingfang(100)}年&lt;/h1&gt;
      &lt;/div&gt;
<span style="color: rgba(0, 0, 0, 1)">    )
}</span></pre>
</div>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">不能出现</span>for<span style="font-family: 宋体">循环、</span><span style="font-family: Consolas">if</span><span style="font-family: 宋体">语句、</span><span style="font-family: Consolas">while</span><span style="font-family: 宋体">、</span><span style="font-family: Consolas">do</span><span style="font-family: 宋体">语句:</span></p>
<div class="cnblogs_code">
<pre>&lt;h1&gt;<span style="text-decoration: line-through">{for(var i = 0;i &lt; 100;i++){}}</span>&lt;/h1&gt;</pre>
</div>
<p>JSX<span style="font-family: 宋体">不能出现对象(</span><span style="font-family: Consolas">JSON</span><span style="font-family: 宋体">)。</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">render() {
    const obj </span>= {"a":100,"b":200<span style="color: rgba(0, 0, 0, 1)">}
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
      </span>&lt;div&gt;
         <span style="text-decoration: line-through"> &lt;h1&gt;{obj}&lt;/h1&gt;</span>
      &lt;/div&gt;
<span style="color: rgba(0, 0, 0, 1)">    )
}</span></pre>
</div>
<p><span style="font-family: 宋体">此时会报错,如果要在页面显示</span>JSON,应该:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">render() {
<span style="color: rgba(255, 0, 0, 1)">const obj </span></span><span style="color: rgba(255, 0, 0, 1)">= {"a":100,"b":200}
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
      </span>&lt;div&gt;
            &lt;h1&gt;<span style="color: rgba(255, 0, 0, 1)">{JSON.stringify(obj)}</span>&lt;/h1&gt;
      &lt;/div&gt;
<span style="color: rgba(0, 0, 0, 1)">    )
}</span></pre>
</div>
<hr>
<h2><strong>3.6<span style="font-family: 宋体">插值高级</span></strong></h2>
<p>JSX<span style="font-family: 宋体">表达式不能出现引号中,比如有一个变量</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">render() {
    const picUrl </span>= "baby1.jpg"
    <span style="color: rgba(0, 0, 255, 1)">return</span> &lt;div&gt;
      &lt;img src="images/{picUrl}.jpg" /&gt;
    &lt;/div&gt;
}</pre>
</div>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">正确的应该先写在外层的</span>{}<span style="font-family: 宋体">:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">render() {
   <span style="color: rgba(255, 0, 0, 1)"> const picUrl </span></span><span style="color: rgba(255, 0, 0, 1)">= "baby1";
    const tip = '这是黄晓明老婆';
    const url = 'http://www.baidu.com/'</span>
    <span style="color: rgba(0, 0, 255, 1)">return</span> &lt;div&gt;
      &lt;img src=<span style="color: rgba(255, 0, 0, 1)">{</span>"images/" + <span style="color: rgba(255, 0, 0, 1)">picUrl</span> + ".jpg"<span style="color: rgba(255, 0, 0, 1)">}</span> /&gt;
      &lt;img src=<span style="color: rgba(255, 0, 0, 1)">{`</span>images/<span style="color: rgba(255, 0, 0, 1)">${picUrl}</span>.jpg<span style="color: rgba(255, 0, 0, 1)">`}</span> title=<span style="color: rgba(255, 0, 0, 1)">{tip}</span> /&gt;
      &lt;a href=<span style="color: rgba(255, 0, 0, 1)">{url}</span>&gt;去百度&lt;/a&gt;
    &lt;/div&gt;
}</pre>
</div>
<p>&nbsp;</p>
<p>内嵌样式要求这样的语法插值:</p>
<p>style<span style="font-family: 宋体">后面直接跟着</span><span style="font-family: Consolas">{{}}</span><span style="font-family: 宋体">,没有引号,</span><span style="font-family: Consolas">{{}}</span><span style="font-family: 宋体">中是</span><span style="font-family: Consolas">JSON</span><span style="font-family: 宋体">,所有的属性名都是驼峰命名法:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">={{"width":"100px","height":"100px","backgroundColor":"red"}}</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p>react<span style="font-family: 宋体">的程序,可以进行合理的换行</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">={{
    </span><span style="color: rgba(255, 0, 0, 1)">"width":"100px",
    "height":"100px",
    "backgroundColor":"red"
}}</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<hr>
<h2><strong>3.7 jsx<span style="font-family: 宋体">中数组内容会被自动展开(重点)</span></strong></h2>
<p><span style="font-family: 宋体">此时你心里可能有一万个草泥马,这是什么鬼,数组怎么能不加引号呢?因为是</span>JSX<span style="font-family: 宋体">语法规定。</span></p>
<div class="cnblogs_code">
<pre>import React from "react"<span style="color: rgba(0, 0, 0, 1)">;
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class App extends React.Component {
    constructor() {
      super();
    }
    render() {
      <span style="color: rgba(255, 0, 0, 1)">const arr </span></span><span style="color: rgba(255, 0, 0, 1)">= [
            &lt;li key="0"&gt;牛奶&lt;/li&gt;,
            &lt;li key="1"&gt;咖啡&lt;/li&gt;,
            &lt;li key="2"&gt;奶茶&lt;/li&gt;,
            &lt;li key="3"&gt;可乐&lt;/li&gt;
      ]
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> &lt;div&gt;
             &lt;ul&gt;<span style="color: rgba(255, 0, 0, 1)">
               {arr}
             </span>&lt;/ul&gt;
      &lt;/div&gt;
<span style="color: rgba(0, 0, 0, 1)">    }
}</span></pre>
</div>
<p><span style="font-family: 宋体">只要你在</span>{}<span style="font-family: 宋体">放一个数组,此时这个数组不用循环了,就会自动被展开。</span></p>
<p><span style="font-family: 宋体">所有的数组元素,必须加上</span>key<span style="font-family: 宋体">属性,否则报错</span></p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/blog/1491596/201904/1491596-20190420135545431-2127780980.png"></p>
<p>注意:</p>
<p>数组有4<span style="font-family: 宋体">项,每项都是</span><span style="font-family: Consolas">jsx</span><span style="font-family: 宋体">元素,不需要加引号</span></p>
<p><span style="font-family: 宋体">每项必须要有不同的</span>key<span style="font-family: 宋体">属性,这是</span><span style="font-family: Consolas">react</span><span style="font-family: 宋体">要求的</span></p>
<p><span style="font-family: 宋体">数组直接</span>{arr}<span style="font-family: 宋体">就可以了,也不需要写循环遍历语句。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">数据和</span>DOM<span style="font-family: 宋体">怎么进行模板的循环:</span></p>
<p>arr<span style="font-family: 宋体">数组中,没有任何的标签,只是数据:此时就要在</span><span style="font-family: Consolas">{}</span><span style="font-family: 宋体">中用</span><span style="font-family: Consolas">map</span><span style="font-family: 宋体">来映射一个新的数组</span></p>
<div class="cnblogs_code"><img id="code_img_closed_114b0e25-0394-4ca3-bcfc-097b4aab54ff" class="code_img_closed lazyload" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_114b0e25-0394-4ca3-bcfc-097b4aab54ff" class="code_img_opened lazyload" style="display: none" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_114b0e25-0394-4ca3-bcfc-097b4aab54ff" class="cnblogs_code_hide">
<pre>import React from "react"<span style="color: rgba(0, 0, 0, 1)">;
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class App extends React.Component {
    constructor() {
      super();
    }
    render() {
      const arr </span>= ["牛奶","咖啡","奶茶","可乐"<span style="color: rgba(0, 0, 0, 1)">]
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> &lt;div&gt;
             &lt;ul&gt;<span style="color: rgba(0, 0, 0, 1)">
               {arr.map((item,index)</span>=&gt;<span style="color: rgba(0, 0, 0, 1)">{
                  </span><span style="color: rgba(0, 0, 255, 1)">return</span> &lt;li key={index}&gt;{item}&lt;/li&gt;
<span style="color: rgba(0, 0, 0, 1)">               })}
             </span>&lt;/ul&gt;
      &lt;/div&gt;
<span style="color: rgba(0, 0, 0, 1)">    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">示例代码</span></div>
<p>映射出一个表格:</p>
<div class="cnblogs_code"><img id="code_img_closed_5c192f2c-8b41-47af-b964-67c211b00b57" class="code_img_closed lazyload" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_5c192f2c-8b41-47af-b964-67c211b00b57" class="code_img_opened lazyload" style="display: none" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_5c192f2c-8b41-47af-b964-67c211b00b57" class="cnblogs_code_hide">
<pre>import React from "react"<span style="color: rgba(0, 0, 0, 1)">;
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class App extends React.Component {
    constructor() {
      super();
    }
    render() {
      const arr </span>=<span style="color: rgba(0, 0, 0, 1)"> [
            {</span>"id":1,"name":"小明","age":12,"sex":"男"<span style="color: rgba(0, 0, 0, 1)">},
            {</span>"id":2,"name":"小红","age":13,"sex":"女"<span style="color: rgba(0, 0, 0, 1)">},
            {</span>"id":3,"name":"小刚","age":14,"sex":"男"<span style="color: rgba(0, 0, 0, 1)">},
            {</span>"id":4,"name":"小白","age":15,"sex":"男"<span style="color: rgba(0, 0, 0, 1)">}
      ]
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> &lt;div&gt;
             &lt;table&gt;
               &lt;tbody&gt;<span style="color: rgba(0, 0, 0, 1)">
                  {
                        arr.map(item</span>=&gt;<span style="color: rgba(0, 0, 0, 1)">{
                            </span><span style="color: rgba(0, 0, 255, 1)">return</span> &lt;tr key={item.id}&gt;
                              &lt;td&gt;{item.id}&lt;/td&gt;
                              &lt;td&gt;{item.name}&lt;/td&gt;
                              &lt;td&gt;{item.age}&lt;/td&gt;
                              &lt;td&gt;{item.sex}&lt;/td&gt;
                            &lt;/tr&gt;
<span style="color: rgba(0, 0, 0, 1)">                        })
                  }
               </span>&lt;/tbody&gt;
             &lt;/table&gt;
      &lt;/div&gt;
<span style="color: rgba(0, 0, 0, 1)">    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">示例代码</span></div>
<hr>
<h2><strong>3.8<span style="font-family: 宋体">九九乘法表</span></strong></h2>
<p>学习的是二维数组的展开</p>
<p><span style="font-family: 宋体">我们先有一个套路,准备一个外层的数组,然后外层的循环中</span>push<span style="font-family: 宋体">内部数组:</span></p>
<div class="cnblogs_code"><img id="code_img_closed_a0c6dcbd-ee78-4371-b459-778b9c5ca9f4" class="code_img_closed lazyload" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_a0c6dcbd-ee78-4371-b459-778b9c5ca9f4" class="code_img_opened lazyload" style="display: none" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_a0c6dcbd-ee78-4371-b459-778b9c5ca9f4" class="cnblogs_code_hide">
<pre>import React from "react"<span style="color: rgba(0, 0, 0, 1)">;
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class App extends React.Component {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">构造函数</span>
<span style="color: rgba(0, 0, 0, 1)">    constructor() {
      super();
    }
    render() {
      </span><span style="color: rgba(0, 0, 255, 1)">var</span> arr =<span style="color: rgba(0, 0, 0, 1)"> [];
      </span><span style="color: rgba(0, 0, 255, 1)">for</span>(<span style="color: rgba(0, 0, 255, 1)">var</span> i = 1;i &lt;= 9;i++<span style="color: rgba(0, 0, 0, 1)">){
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> temp =<span style="color: rgba(0, 0, 0, 1)"> []
            </span><span style="color: rgba(0, 0, 255, 1)">for</span>(<span style="color: rgba(0, 0, 255, 1)">var</span> j = 1; j &lt;= i; j++<span style="color: rgba(0, 0, 0, 1)">) {
                temp.push(</span>&lt;td key={j}&gt; {i} * {j} = {i*j} &lt;/td&gt;)
<span style="color: rgba(0, 0, 0, 1)">            }
            arr.push(</span>&lt;tr key={i}&gt;{temp}&lt;/tr&gt;)
<span style="color: rgba(0, 0, 0, 1)">      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
            </span>&lt;div&gt;
               &lt;table&gt;
                  &lt;tbody&gt;<span style="color: rgba(0, 0, 0, 1)">
                        {arr}
                  </span>&lt;/tbody&gt;
               &lt;/table&gt;
            &lt;/div&gt;
<span style="color: rgba(0, 0, 0, 1)">      )
    }
};</span></pre>
</div>
<span class="cnblogs_code_collapse">实力代码</span></div>
<hr>
<h2><strong>3.9<span style="font-family: 宋体">日历</span></strong></h2>
<p>日历的原理,决定一个日历的画风,有三要素:</p>
<p>&nbsp;这个月第一天是星期几;</p>
<p>&nbsp;这个月有几天;</p>
<p>&nbsp;上个月有几天;</p>
<p align="justify">&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">要知道2018年5月5日是星期几:
</span><span style="color: rgba(0, 0, 255, 1)">new</span> Date(2018,5-1,5<span style="color: rgba(0, 0, 0, 1)">).getDay()

要知道2018年5月有几天:
</span><span style="color: rgba(0, 0, 255, 1)">new</span> Date(2018,5,0).getDate()</pre>
</div>
<p align="justify">&nbsp;</p>
<p><span style="font-family: 宋体">本月有几天,等价于下个月前一天是几号,所以下个月的</span>0<span style="font-family: 宋体">号,就是本月的最后一天。</span></p>
<p align="justify">&nbsp;</p>
<p>&nbsp;</p>
<p>给日历加农历:</p>
<div class="cnblogs_code">
<pre>npm install --save solarlunar</pre>
</div>
<div class="cnblogs_code">
<pre>import React from "react"<span style="color: rgba(0, 0, 0, 1)">;
import solarLunar from </span>'solarLunar'<span style="color: rgba(0, 0, 0, 1)">;
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class App extends React.Component {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">构造函数</span>
<span style="color: rgba(0, 0, 0, 1)">    constructor() {
      super();
    }
    render() {
      </span><span style="color: rgba(0, 0, 255, 1)">var</span> year = 2018<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">var</span> month = 8; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">是人类的月份,而不是计算机的</span>
      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">本月第一天是星期几</span>
      <span style="color: rgba(0, 0, 255, 1)">var</span> TheMonthFirstDay = <span style="color: rgba(0, 0, 255, 1)">new</span> Date(year,month - 1,1<span style="color: rgba(0, 0, 0, 1)">).getDay();
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">本月共几天</span>
      <span style="color: rgba(0, 0, 255, 1)">var</span> TheMonthDays = <span style="color: rgba(0, 0, 255, 1)">new</span> Date(year,month,0<span style="color: rgba(0, 0, 0, 1)">).getDate();
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">上个月共几天</span>
      <span style="color: rgba(0, 0, 255, 1)">var</span> prevMonthDays = <span style="color: rgba(0, 0, 255, 1)">new</span> Date(year,month-1,0<span style="color: rgba(0, 0, 0, 1)">).getDate();

      </span><span style="color: rgba(0, 0, 255, 1)">var</span> arr =<span style="color: rgba(0, 0, 0, 1)"> [];
      
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">上个月的尾巴,本月第一天星期几就有几天上个月的尾巴</span>
      <span style="color: rgba(0, 0, 255, 1)">while</span> (TheMonthFirstDay--<span style="color: rgba(0, 0, 0, 1)">){
            arr.unshift(prevMonthDays</span>--<span style="color: rgba(0, 0, 0, 1)">)
      }

      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 本月放进数组</span>
      <span style="color: rgba(0, 0, 255, 1)">var</span> count = 1<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">while</span>(TheMonthDays--<span style="color: rgba(0, 0, 0, 1)">){
            arr.push(count</span>++<span style="color: rgba(0, 0, 0, 1)">);
      }
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 下个月的前有多少天,要补齐42天</span>
      <span style="color: rgba(0, 0, 255, 1)">var</span> nextCount = 1<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">while</span> ( arr.length != 42<span style="color: rgba(0, 0, 0, 1)">){
            arr.push(nextCount</span>++<span style="color: rgba(0, 0, 0, 1)">);
      }
      console.log(arr)
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">接下来要用这个一维数组集合JSX语法,展开为二维数组</span>
      const showTable = ()=&gt;<span style="color: rgba(0, 0, 0, 1)">{
            </span><span style="color: rgba(255, 0, 0, 1)">var domArr = [];
            for(var i = 0; i &lt; arr.length / 7; i++</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)">){</span>
             <span style="color: rgba(0, 0, 255, 1)">   domArr.push(
               </span>   </span><span style="color: rgba(0, 0, 255, 1)">&lt;tr</span><span style="color: rgba(255, 0, 0, 1)"> key={i}</span>&gt;<span style="color: rgba(0, 0, 0, 1)">
                        {
                            <span style="color: rgba(0, 0, 255, 1)">arr.slice(i </span></span><span style="color: rgba(0, 0, 255, 1)">* 7, i * 7 + 7).map(item=&gt;{
                              </span><span style="color: rgba(255, 0, 0, 1)">var n = solarLunar.solar2lunar(year, month, item);
                              </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 255, 1)"> &lt;td key={item}&gt;</span><span style="color: rgba(255, 0, 0, 1)">
                                    {item}
                                    </span>&lt;br/&gt;
                                 <span style="color: rgba(255, 0, 0, 1)"> {n.term || n.dayCn}
                              </span><span style="color: rgba(0, 0, 255, 1)">&lt;/td&gt;
</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 0, 255, 1)">                            })</span>
                        }
                  </span><span style="color: rgba(0, 0, 255, 1)">&lt;/tr&gt;   </span>   
<span style="color: rgba(0, 0, 0, 1)">                )
         <span style="color: rgba(255, 0, 0, 1)"> }
            </span></span><span style="color: rgba(255, 0, 0, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)"> domArr;</span>
      }

      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
            </span>&lt;div&gt;
               &lt;table&gt;
                     &lt;thead&gt;
                         &lt;tr&gt;
                           &lt;th&gt;日&lt;/th&gt;
                           &lt;th&gt;一&lt;/th&gt;
                           &lt;th&gt;二&lt;/th&gt;
                           &lt;th&gt;三&lt;/th&gt;
                           &lt;th&gt;四&lt;/th&gt;
                           &lt;th&gt;五&lt;/th&gt;
                           &lt;th&gt;六&lt;/th&gt;
                         &lt;/tr&gt;
                     &lt;/thead&gt;
                     &lt;tbody&gt;<span style="color: rgba(255, 0, 0, 1)">
                        {showTable()}
                     </span>&lt;/tbody&gt;
               &lt;/table&gt;
            &lt;/div&gt;
<span style="color: rgba(0, 0, 0, 1)">      )
    }
};</span></pre>
</div>
<hr>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    <hr/>
文章都是本人学习时的笔记整理,希望看完后能对您有所帮助,欢迎大家提意见,多多交流。
<br/>
也有些文章是转载的,如果存在转载文章且没有标注转载地址的,请与我联系,马上处理。
<br/>
自由转载-非商用-非衍生-保持署名。<br><br>
来源:https://www.cnblogs.com/rope/p/10740792.html
頁: [1]
查看完整版本: 前端笔记之React(一)初识React&组件&JSX语法