React 入门(4)React+TypeScript
<h2>序言</h2><p> </p>
<h2>设置淘宝镜像</h2>
<p>npm config get cache</p>
<p>npm config get prefix</p>
<p>npm config get registry</p>
<p>npm config set registry https://registry.npmjs.org</p>
<p>npm config set registry https://registry.npm.taobao.org</p>
<h2>npm</h2>
<p>如果没有create-react-app命令行脚手架,可以先下载个</p>
<p>npm install -g create-react-app</p>
<p>然后我们使用其创建一个typescript项目</p>
<p>create-react-app my-app --tempalte typescript</p>
<p>进后项目,启动</p>
<p>npm start</p>
<h2>yarn</h2>
<div class="language-sh highlighter-rouge">
<div class="highlight">
<p>注意:建议不要放在node的文件夹里,将其放在另一个文件夹,否则会影响node安装的全局命令使用。</p>
<p>yarn config set global-folder "D:\Web\Node\yarn\global"</p>
<p>yarn config set cache-folder "D:\Web\Node\yarn\cache"</p>
<p><strong>创建项目</strong></p>
<p>yarn create react-app react-typescript-app --typescript</p>
<p>yarn</p>
<p>yarn start</p>
<p><strong>集成</strong></p>
<p><strong>less</strong></p>
<p>https://www.cnblogs.com/lyzw-Y/p/11566631.html</p>
<p class="brush:bash;gutter:true;"><strong>webpack</strong></p>
<p>yarn add webpack</p>
<p><strong>ant design</strong></p>
<p>yarn add antd</p>
<p><strong>Redux </strong></p>
<p>yarn add redux</p>
<p>yarn add react-redux</p>
<p>yarn add redux-thunk yarn add redux-saga</p>
<p><span class="fontstyle0">yarn add redux<span class="fontstyle0">-<span class="fontstyle0">logger <br></span></span></span></p>
<p>yarn add react-router-dom</p>
<p><strong>DvaJS</strong></p>
<p> </p>
<p><strong>Umi</strong></p>
<p>全局安装umi,版本是2.0.0或以上</p>
<p class="line-numberslanguage-ruby">yarn global add umi</p>
<p>yarn create umi</p>
<p>umi block list</p>
<p>https://pro.ant.design/docs/block</p>
<p> </p>
<p>创建页面</p>
<p>umi g page index</p>
<p>umi g page users</p>
<p>启动本地服务器</p>
<p>umi dev</p>
</div>
</div>
<h2>概念</h2>
<p><strong>useState</strong></p>
<div class="cnblogs_code"><img id="code_img_closed_e7615454-8d0d-49a5-b6c1-0dd9f41d1037" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_e7615454-8d0d-49a5-b6c1-0dd9f41d1037" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_e7615454-8d0d-49a5-b6c1-0dd9f41d1037" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">import React, { useState } from 'react'
import './App.css'
export default function App() {
const = useState(0);
const = useState('Star');
// 调用三次setCount便于查看更新队列的情况
const countPlusThree = () => {
setCount(count+1);
setCount(count+2);
setCount(count+3);
}
return (
</span><span style="color: rgba(0, 0, 255, 1)"><</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)">='App'</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>{name} Has Clicked <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">strong</span><span style="color: rgba(0, 0, 255, 1)">></span>{count}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">strong</span><span style="color: rgba(0, 0, 255, 1)">></span> Times<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">button </span><span style="color: rgba(255, 0, 0, 1)">onClick</span><span style="color: rgba(0, 0, 255, 1)">={countPlusThree}</span><span style="color: rgba(0, 0, 255, 1)">></span>Click *3<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">button</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">
)
}
复制代码</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p class="hljs javascript"><code> <span class="hljs-keyword">const = useState(<span class="hljs-number">0);</span></span></code></p>
<p class="hljs typescript"><code><span class="hljs-keyword">const = useState<<span class="hljs-built_in">number>(<span class="hljs-number">0)</span></span></span></code></p>
<p class="hljs typescript"><strong><span class="hljs-keyword"><span class="hljs-built_in"><span class="hljs-number">useEffect</span></span></span></strong></p>
<p><span class="hljs-keyword"><span class="hljs-built_in"><span class="hljs-number">React Hooks+Umi+TypeScript+Dva开发体验</span></span></span></p>
<p><strong>组件 & Props</strong></p>
<p>组件,从概念上类似于 JavaScript 函数。它接受任意的入参(即 “props”),并返回用于描述页面展示内容的 React 元素。</p>
<p>函数组件与 class 组件</p>
<p>定义组件最简单的方式就是编写 JavaScript 函数:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">function Welcome(props) {
return </span><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">h1</span><span style="color: rgba(0, 0, 255, 1)">></span>Hello, {props.name}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">h1</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">;
}
export default RoomItem;</span></pre>
</div>
<p>该函数是一个有效的 React 组件,因为它接收唯一带有数据的 “props”(代表属性)对象与并返回一个 React 元素。这类组件被称为“函数组件”,因为它本质上就是 JavaScript 函数。</p>
<p>你同时还可以使用 ES6 的 class 来定义组件:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">class Welcome extends React.Component {
render() {
return </span><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">h1</span><span style="color: rgba(0, 0, 255, 1)">></span>Hello, {this.props.name}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">h1</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">;
}
}</span></pre>
</div>
<p>上述两个组件在 React 里是等效的。</p>
<p><strong>展开运算符{...props}</strong></p>
<p>解决属性过多,一个个书写麻烦的问题。</p>
<div>
<div><strong>React.FC</strong></div>
<div>React.FC<>的在typescript使用的一个泛型,在这个泛型里面可以使用useState,个人觉得useState挺好用的,例子如下:</div>
</div>
<div class="cnblogs_code"><img id="code_img_closed_e30640b4-db65-406f-aef4-610c4f5c747a" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_e30640b4-db65-406f-aef4-610c4f5c747a" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_e30640b4-db65-406f-aef4-610c4f5c747a" class="cnblogs_code_hide">
<pre>const SampleModel: React.FC<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">{}</span><span style="color: rgba(0, 0, 255, 1)">></span> = () =>{ //React.FC<span style="color: rgba(0, 0, 255, 1)"><></span><span style="color: rgba(0, 0, 0, 1)">为typescript使用的泛型
const = useState</span><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">boolean</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">(false);
return{
{/** 触发模态框**/}
</span><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">Button </span><span style="color: rgba(255, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">={{fontSize:'25px'}}</span><span style="color: rgba(255, 0, 0, 1)">onClick</span><span style="color: rgba(0, 0, 255, 1)">={()=</span><span style="color: rgba(0, 0, 255, 1)">></span>handleModalVisible(true)} >样例<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">Button</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">
{/** 模态框组件**/}
</span><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">Model </span><span style="color: rgba(255, 0, 0, 1)">onCancel</span><span style="color: rgba(0, 0, 255, 1)">={() =</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)"> handleModalVisible(false)} ModalVisible={createModalVisible} />
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>React.Fragment 组件</p>
<div class="cnblogs_code"><img id="code_img_closed_bf1464ec-aa72-48b1-b3b8-2670aec18bb4" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_bf1464ec-aa72-48b1-b3b8-2670aec18bb4" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_bf1464ec-aa72-48b1-b3b8-2670aec18bb4" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">class Columns extends React.Component {
render() {
return (
</span><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">React</span><span style="color: rgba(255, 0, 0, 1)">.Fragment</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">></span>Hello<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">></span>World<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">React.Fragment</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">
);
}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>生成器函数</p>
<p>yield关键字:暂停</p>
<p>组件类引入了复杂的编程模式,比如 render props 和高阶组件。</p>
<p>React 团队希望,组件不要变成复杂的容器,最好只是数据流的管道。开发者根据需要,组合管道即可。 组件的最佳写法应该是函数,而不是类。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> Welcome(props) {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <h1>Hello, {props.name}</h1>;
}</pre>
</div>
<p>但是,这种写法有重大限制,必须是纯函数,不能包含状态,也不支持生命周期方法,因此无法取代类。</p>
<p>React Hooks 的设计目的,就是加强版函数组件,完全不使用"类",就能写出一个全功能的组件。</p>
<p> </p>
<p> </p>
<h2>资料</h2>
<p>Create React App 中文文档</p>
<p>yarn报“文件名、目录名或卷标语法不正确”错误的解决方案</p>
<p><strong style="margin: 0; padding: 0; font-family: Verdana, Arial, Helvetica, sans-serif">Redux </strong></p><br><br>
来源:https://www.cnblogs.com/cnki/p/12676582.html
頁:
[1]