Начало работы с TypeScript, написание компонента индикатора выполнения реакции
пиши на фронт
- Если вы писали React-компоненты, эта статья для вас в принципе не сложна. Чисто с небольшим знанием ц.
- Я полностью описываю процесс написания компонентов с точки зрения ученика, пожалуйста, укажите много неточностей, ха-ха.
Взгляните на достигнутый эффект - эффект gif-анимации
- Конечно, вы можете нажать здесь, чтобы попробовать эффект самостоятельно.Страница эффектов
- Вы также можете открыть codeSandbox ниже, чтобы взглянуть на исходный код.
начать
-
Это обычный UI компонент, и сложность в основном в дизайне (css).
-
Требование: пошаговая панель точности, нам нужно только ввести параметры, шаг и сумму, чтобы рассчитать процент, а затем отобразить его, хорошо.
/*
* @param step 第几步
* @param total 总共的步骤
* @param showInfo 是否需要显示百分比提示
* @param color 可以自定义颜色
*/
Достаточно сказано, давайте начнем
- Конфигурация окружения пропущена, тут напрямую пишем код
- Необходимо настроить node, ts, меньше среды
1, progressBar создает папку в вашем файле компонентов. tsx реагирует на специальные файлы ts. Затем продолжайте добавлять index.tsx и style.less в progressBar ниже.
-- componments
-- progressBar
-- index.tsx
-- style.less
2. Сначала введите необходимые компоненты
- index.tsx
import React, { Component } from 'react';
import * as PropTypes from 'prop-types';
import './style.less';
// 定义接口
export interface IProgressProps{
}
// 定义类
class ProgressBar extends Component<IProgressProps> {
}
export default ProgressBar;
要点
: IProgressProps, названный с использованием паскаля, с использованиемI
В начале Props представляет поддержку параметров этого интерфейса.
3. Согласно анализу наших требований выше, давайте определим интерфейс, определим propTypes и defalutProps класса
export interface IProgressProps {
// prefixCls 为了以后样式统一设置的 classname
prefixCls?: string;
step?: number;
total?: number;
showInfo?: boolean;
color?: string;
}
class ProgressBar extends Component<IProgressProps> {
//设置默认值
static defaultProps = {
prefixCls: 'demo-progress',
step: 2,
total: 10,
showInfo: false,
color: '#FFE103'
};
render(){
return(
<div>progressBar</div>
)
}
}
-
фокус, объяснил здесь.
为什么用了 ts 和还用 prop-types?
Чтобы ограничить код, после публикации статьи некоторые друзья указали, что она повторяется. Потому что я не заметил этого в начале написания ts, а потом сосредоточился на проверке актуальной информации. Выяснилось, что их можно смешивать. -
В заключение
Вы можете использовать только typescript для проверки, вы можете использовать только prop-types для проверки, или вы можете смешивать и сопоставлять два для проверки, Это не строго ограничено.Проверка подсказок с помощью машинописного текста — это функция языка ts, а использование prop-types для проверки подсказок — это функция, добавленная в react.
要点
: "?" является необязательным, а число является типом параметра интерфейса. Это означает, что то, что вы вводите, должно быть числовым типом, иначе ts сообщит об ошибке. Здесь мы можем обратиться к модулю progressBar, чтобы убедиться, что он успешен. Если progressBar реализован, это означает успех.
4, обработка индикации прогресса UI и контент текста, визуализация
/**
* @desc 处理 progressNumber
*/
const validProgress = (progress: number | undefined) => {
//当你的参数定义了 number 等类型,你必须对 !progress 的时候处理,不然 ts 会提示你错误。
if (!progress || progress < 0) {
return 0;
} else if (progress > 100) {
return 100;
}
return progress;
};
/**
* @desc 除法处理成0-100的整数
* @param step
* @param total
*/
const percentDeal = (step: number | undefined, total: number | undefined) => {
if (!step || !total) {
return 0;
}
return (step / total) * 100;
};
/**
* @param text 百分比显示
*/
const parseIntPrecent = (text: number): string => `${Math.ceil(text)}%`;
class ProgressBar extends Component<IProgressProps> {
/* ...
....defaultProps
.....propTypes
......
*/
render(){
// 把需要的值先从 this.props 中取出来
// restProps 扩充参数用
const {
prefixCls,
step,
total,
showInfo,
color,
...restProps
} = this.props;
/**
* percent 百分比
* text tip 显示文字
* progressInfo 提示模块
* porgress 主模块
*/
let percent;
let text;
let progressInfo;
let progress;
//处理百分比显示内容
percent = percentDeal(step, total);
text = parseIntPrecent(validProgress(percent));
// 如果 true 的话,我们使用创建一个 showInfo 模块
if (showInfo) {
progressInfo = (
<div className={`${prefixCls}-show-info`}>
<span className={`${prefixCls}-text`}>{text}</span>
</div>
);
}
//创建一个主模块用做进度条
//prefixCls 这里统一了命名
progress = (
<div>
<div className={`${prefixCls}-outer`}>
<div className={`${prefixCls}-inner`}>
<div className={`${prefixCls}-bg`}>
{progressInfo || null}
</div>
</div>
</div>
</div>
);
return (
<div {...restProps} className={`${prefixCls}`}>
{progress}
</div>
);
}
}
要点
: Определите функцию, которая обрабатывает данные вне класса, не обрабатывайте данные в рендере. Существует много реализации панели прогресса, вот обычные три слоя, текст, фон, прогресс бар и внешний слой.
5. Реализуйте стиль в соответствии с приведенным выше дизайном gif.
- style.less
.tiger-progress {
&-outer {
width: 100%;
display: inline-block;
margin-top:30px;
margin-right: 0;
padding-right: 0;
}
&-inner {
vertical-align: middle;
display: inline-block;
background: #eeeeee;
border-radius: 100px;
position: relative;
width: 100%;
}
//预留 &-bg 背景颜色代表进度条的长度,灰色的 inner 背景
&-line {
width: 100%;
font-size: inherit;
position: relative;
}
&-text {
word-break: normal;
width: 2em;
text-align: left;
font-size: 1em;
margin-left: 8px;
vertical-align: middle;
display: inline-block;
white-space: nowrap;
line-height: 1;
}
}
要点
: // &-bg Цвет представляет длину индикатора выполнения, а серый &-внутренний фон — общую длину.
- Дополнить код в рендере, и установить длину индикатора выполнения в соответствии с данными, рассчитанными по шагу ввода и сумме.
const {
prefixCls,
step,
total,
showInfo,
color,
...restProps
} = this.props;
/**
* percent 百分比
* text tip 显示文字
* progressInfo 提示模块
* porgress 主模块
*/
let percent;
let text;
let progressInfo;
let progress;
percent = percentDeal(step, total);
console..log("percent",percent)
// percent: 20
text = parseIntPrecent(validProgress(percent));
console.log('text',text)
// text: 20%
if (showInfo) {
progressInfo = (
<div className={`${prefixCls}-show-info`}>
<span className={`${prefixCls}-text`}>{text}</span>
</div>
);
}
// color defalutProps 定义默认的颜色
// 前面&-bg 设置 relative 定位
const fixBgStyle = {
width: text,
height: "12px",
background: color,
borderRadius: "100px"
};
progress = (
<div>
<div className={`${prefixCls}-outer`}>
<div className={`${prefixCls}-inner`}>
<div className={`${prefixCls}-bg`} style={fixBgStyle}>
{progressInfo || null}
</div>
</div>
</div>
</div>
);
return (
<div {...restProps} className="tiger-progress">
{progress}
</div>
);
ты закончил
- Это очень просто, давайте посмотрим на эффект
- код sandbox.io/is/940 лет назад 3531…, отлаживать код
Ответьте на вопрос: зачем использоватьts
также использоватьprop-types
?
-
Обычно мы пишем
react
Когда мы будем, мы определим одинprop-types
проверить нашclass
ввод параметра. в то время как ТСinterface
Конечно, роль также заключается в проверкеprops
ввод. -
两者的区别
:TypeScrip
проверка типов статическая,prop-types
Можно проверить во время выполнения. как вы проходитеoffsetTop="abc"
, ваш редактор может сообщить вам, что тип неверен, но в браузере он все равно работает нормально. и если вы используетеprop-types
, в браузере появится подсказка.
Резюме: Таким образом, их можно смешивать,
功能上有部分重复
, поэтому мы не можем писать после использования машинописного текстаprop-types
делать дополнительночек об оплате.