предисловие
Эта статья является одиннадцатой статьей авторского дизайна компонента письма.Сегодня я познакомлю вас с реализацией не менее специального компонента — компонента глобального сообщения. Эффект компонента, который мы видим, может выглядеть так:
Базовая компонентная библиотека в основном разделена на следующие категории.:
- Универсальные компоненты: Например, кнопка, значок и т. д.
- компонент макета: такие как сетка, макет макета и т. д.
- Группа навигацииЧасти: такие как хлебные крошки, раскрывающийся список, меню и т. д.
- Компонент ввода данных: Например, форма формы, переключатель переключения, загрузка файла загрузки и т. д.
- компонент отображения данных: например, аватар аватара, таблица таблиц, список списков и т. д.
- компонент обратной связи: например, индикатор выполнения, ящик ящика, модальное диалоговое окно и т. д.
- Другие виды бизнеса
Знакомство с приведенным выше методом классификации является предпосылкой проектирования любой компонентной системы, независимо от того, находитесь ли вы с нуля до библиотеки пользовательского интерфейса, от нуля до клиентской команды, или на основе вторичного бизнес-компонента разработки существующей библиотеки компонентов, приведенная выше классификация метод одинаково применим.
В этой статье для разработки компонента будет использоваться React, а также некоторые часто используемые Javascript.Шаблоны проектирования,Напримеродноэлементный шаблон, но какой бы фреймворк вы ни использовали для его реализации, принцип универсален, если вам интересно, то для его реализации можно использовать и vue. Если вы мало знаете о шаблонах проектирования, вы можете двигаться дальше:
текст
Прежде чем приступить к разработке компонента, я надеюсь, что у вас есть определенные основы в CSS3 и JS и вы понимаете базовый синтаксис react/vue.Давайте сначала разберем компонент сообщения.Сообщение разделено на следующие части:
Ниже приведены компонент сообщения после эффектов, которые я использую, реагирую на достижение:
Далее давайте рассмотрим конкретные идеи дизайна окна напоминания об уведомлении (Message).
1. Идеи дизайна компонента сообщения
В соответствии с принципами проектирования компонентов, изложенными автором ранее, нашим первым шагом является подтверждение требований.Компонент окна напоминания с уведомлением (сообщение) обычно имеет следующие требования:
- Может контролировать время, когда сообщение автоматически закрывается
- Можно настроить выходное местоположение узла рендеринга сообщений.
- Настраиваемый значок закрытия
- Тип глобальной подсказки можно выбрать вручную
- Можно настроить смещение глобальной подсказки
- Можно установить информационный текст глобальной подсказки
- Значки, которые могут настраивать глобальные подсказки
- Обеспечьте функцию обратного вызова при нажатии глобальной подсказки
- Обеспечивает функцию обратного вызова, когда глобальная подсказка закрыта
- Возможность вручную уничтожать окна уведомлений
После того, как требования будут собраны, как начинающий программист, будут нарисованы следующие каркасы:
2. Реализовать компонент глобального сообщения на основе реакции
Для основной части компонента мы по-прежнему используем режим React Notification.
2.1 Создание основного каркаса окна напоминания об уведомлении (Уведомление)
В первую очередь, согласно авторскому стилю кода, в целом рассматривается фреймворк компонентного дизайна, а затем шаг за шагом в него наполняется контент и логика. Благодаря этой прогрессивной дизайнерской идее мы можем сделать нашу логику более строгой и ясной. Конкретный код выглядит следующим образом:
import Notification from 'rc-notification'
import './index.less'
const xMessage = (function() {
let message = null
/**
* notice类型弹窗
* @param {config} object 提示框配置属性
* @param {type} string 提示窗类型
* @param {btn} ReactNode 自定义关闭按钮
* @param {className} string 自定义 CSS class
* @param {duration} number 默认 4.5 秒后自动关闭,配置为 null 则不自动关闭
* @param {getContainer} HTMLNode 配置渲染节点的输出位置
* @param {icon} ReactNode 自定义图标
* @param {key} string 当前提示唯一标志
* @param {content} string|ReactNode 提示标题,必选
* @param {onClose} func 点击默认关闭按钮时触发的回调函数
* @param {onClick} func 点击提示时触发的回调函数
* @param {top} number 消息从顶部弹出时,距离顶部的位置,单位像素
* @param {closeIcon} ReactNode 自定义关闭图标
*/
const pop = (config) => {
const {
type, className,
duration = 4.5,
getContainer = () => document.body,
icon, key, content, onClose, onClick,
top, closable = true, closeIcon
} = config
message.notice({
content: <div className={classnames('xMessage', className )}>
<div className={classnames('iconWrap', type)}>
<Icon type={iconType[type]} />
</div>
<div className="xNoticeTit">
{ content }
</div>
</div>,
key, closable, getContainer,
onClose() {
onClose && onClose()
},
onClick() {
onClick && onClick()
},
closeIcon, duration, style: { top }
})
}
/**
* 提示提示组件, 全局参数
* @param {duration} number 默认自动关闭延时,单位秒
* @param {getContainer} HTMLNode 配置渲染节点的输出位置,默认document.body
* @param {closeIcon} HTMLNode 自定义关闭图标
*/
const config = (config) => {}
const remove = (key) => {}
const destroy = () => {}
if(message) {
return {
config, pop, remove, destroy
}
}
// 如果为创建实例,则创建默认实例
Notification.newInstance({}, (notice) => message = notice)
return {
config, pop, remove, destroy
}
})()
export default xMessage
Прежде всего, мы перечисляем атрибуты в соответствии с потребностями.В результате анализа мы должны предоставить четыре внешних интерфейса для использования разработчиками, а именно:
- config — глобальная конфигурация сообщения, используемая для управления глобальными смещениями, стилями, контейнерами рендеринга и т. д.;
- pop - метод, используемый для создания экземпляра глобальной подсказки при управлении свойствами экземпляра
- remove — используется для удаления указанного экземпляра
- уничтожить - используется для уничтожения глобального сообщения
Сначала реализуем конфиг:
const config = (config) => {
const { duration, getContainer, closeIcon } = config
Notification.newInstance({
getContainer: getContainer,
duration: duration || 4.5,
closeIcon
}, (notice) => message = notice)
}
Конечно, мы также можем настроить расширение в соответствии с нашими потребностями.
Реализация поп-метода:
const pop = (config) => {
const {
type,
className,
duration = 4.5,
getContainer = () => document.body,
icon,
key,
content,
onClose,
onClick,
top,
closable = true,
closeIcon
} = config
message.notice({
content: <div className={classnames('xMessage', className )}>
{
(icon || ['info', 'success', 'error', 'warning'].indexOf(type) > -1) &&
<div className={classnames('iconWrap', type)}>
{
icon ? icon : <Icon type={iconType[type]} />
}
</div>
}
<div className="xNoticeTit">
{ content }
</div>
</div>,
key,
closable,
getContainer,
onClose() {
onClose && onClose()
},
onClick() {
onClick && onClick()
},
closeIcon,
duration,
style: { top }
})
}
Этот метод в основном используется для настройки экземпляра создания глобального сообщения, мы можем назвать его так:
xNotification.pop({type: 'success', content: '你的请求被审批通过啦!'})
Фактический эффект выглядит следующим образом:
// antd
Notification.info({//...})
Причина, по которой автор делает это, заключается в том, что состояния информации, успеха и предупреждения могут фактически повторно использоваться в структуре DOM, поэтому избыточный код может быть значительно сокращен путем настройки.
Методы удаления и уничтожения относительно просты, перейдем непосредственно к коду:
const remove = (key) => {
message.removeNotice(key)
}
const destroy = () => {
message.destroy()
}
Из приведенного выше видно, что их реализации основаны на API, который поставляется с экземпляром сообщения.
2.2 Реализовать тип окна уведомлений и пользовательский значок
Во-первых, давайте определим отношение сопоставления между типом и значком:
const iconType = {
success: 'FaRegCheckCircle',
warning: 'FaRegMeh',
info: 'FaRegLightbulb',
error: 'FaRegTimesCircle'
}
Эти четыре типа соответствуют разным типам значков значков, поэтому мы можем отображать разные значки значков в соответствии с типом, переданным пользователем:
<div className={classnames('iconWrap', type)}>
<Icon type={iconType[type]} />
</div>
Однако мы также должны учитывать, что если пользователь передает пользовательский значок, мы теоретически должны отображать пользовательский значок, поэтому два атрибута типа и значка связаны. Другая ситуация заключается в том, что если пользователь не настраивает тип и передается ли иконка, то отображать иконку фактически нет необходимости, После всестороннего рассмотрения наш код выглядит следующим образом:
{
(icon || ['info', 'success', 'error', 'warning'].indexOf(type) > -1) &&
<div className={classnames('iconWrap', type)}>
{
icon ? icon : <Icon type={iconType[type]} />
}
</div>
}
Эффект следующий:
2.3 Использование компонента глобального сообщения
Мы можем использовать его следующим образом:
<Button type="warning" onClick={
() => {
message.pop({
type: 'error',
content: '趣谈前端学习打卡'
})
}
}>错误信息通知(error)</Button>
Настройте глобальные свойства:
import { message } from '@alex_xu/xui'
message.config({ duration: 6 })
Автор опубликовал реализованные компоненты в npm.Если вам интересно, вы можете установить и использовать их напрямую с npm следующим образом:
npm i @alex_xu/xui
// 导入xui
import {
Button, Skeleton, Empty, Progress,
Message, Tag, Switch, Drawer, Badge, Alert
} from '@alex_xu/xui'
Библиотека компонентов поддерживает импорт по требованию, нам нужно только настроить в проекте babel-plugin-import, конкретная конфигурация выглядит следующим образом:
// .babelrc
"plugins": [
["import", { "libraryName": "@alex_xu/xui", "style": true }]
]
Скриншот библиотеки npm выглядит следующим образом:
наконец
В дальнейшем автор продолжит реализовывать
- table(лист),
- tooltip(панель подсказок),
- Skeleton(скелетный экран),
- form(форма формы),
- switch(выключатель),
- дата/календарь,
- Компонент для чтения QR-кода
и другие компоненты, чтобы рассмотреть многолетний путь автора по компонентизации.
Если вы не знакомы с принципами проектирования компонентов react/vue, вы можете обратиться к моей предыдущей серии статей о дизайне компонентов:
- Быть опытным в серии React/Vue и помочь вам реализовать мощное окно напоминания об уведомлении (Уведомление)
- Практический опыт реализации легковесного и расширяемого модального компонента (Modal)
- «Профессиональное проектирование компонентов React / Vue» с порталами React для реализации мощного компонента ящика
- «Знает дизайн компонентов react/vue» реализует компонент Tag (метка) и компонент Empty (пустое состояние) за 5 минут.
- «Знает дизайн компонентов react/vue» использует чистый CSS для создания анимации нажатия кнопки, похожей на materialUI, и инкапсуляции ее в компоненты реакции.
- «Знает дизайн компонентов react/vue» быстро реализует настраиваемый компонент индикатора выполнения.
- «Знает дизайн компонентов react/vue» на основе вторичной инкапсуляции jsoneditor компонента редактора json, который можно просмотреть в режиме реального времени (версия реакции)
Автор выпустил библиотеку компонентов для npm, и вы можете испытать компоненты через установку npm.
Если вы хотите получить полный исходный код серии статей о дизайне компонентов или хотите узнать большеигра Н5, webpack,node,gulp,css3,javascript,nodeJS,визуализация данных холстаВ ожидании передовых знаний и реальных сражений, добро пожаловать в нашу техническую группу в общедоступном аккаунте «Интересный передний конец», чтобы вместе учиться и обсуждать, а также вместе исследовать границы переднего плана.
больше рекомендаций
- Подведение итогов за 2 года практического опыта проекта Vue
- 15 минут, чтобы понять шаблоны проектирования JavaScript, которые должны знать фронтенд-инженеры (с подробной картой ума и исходным кодом)
- В 2019 году подведите итоги некоторых предварительных вопросов на собеседовании, которые я дал, и советов соискателям.
- Картинка, чтобы научить вас быстро играть в vue-cli3
- Vue advanced advanced series — играйте с vue и vuex с машинописным текстом
- «Резюме переднего плана боя» с использованием чистого css для создания скинов веб-сайта и анимации переключения карты фокусировки.
- «Внешняя сводка боя» с использованием CSS3 для создания крутой вращающейся 3D-перспективы.
- «Резюме переднего плана боя» с использованием темпа.js для добавления индикатора загрузки на ваш веб-сайт.
- Применение шаблонов проектирования в «Резюме фронтального боя» - шаблон меморандума
- «Внешняя сводка боя» с использованием postMessage для реализации подключаемого робота междоменного чата.
- Продвижение переменной, продвижение объявления функции и подробное объяснение области действия переменной в «Сводке по интерфейсу боя».
- «Резюме фронтенда», как изменить URL-адрес, не обновляя страницу