Создание экшенов (Actions)
Экшены являются одной из главных составляющих Redux. Action формально представляют события, которые происходят в приложении, и при возникновении которых должно произойти изменение состояния (state).
Action представляет собой простой интерфейс, который из обязательных полей имеет только type, который должен быть уникальным во всем проекте. Именно с помощью type, reducer понимает, какой action перед ним и что с ним нужно сделать.
Примером простого экшена может быть объект:
{ type: ' Load User'}
Action может содержать необходимые данные, помимо типа. Например :
{ type: ' Load User', userId: 55}
Обычно, все дополнительные свойства называются payload, который формально объединён с action’ом.
Хорошей практикой считается вынесение всех данных в отдельный объект payload:
{ type: ' Load User', payload: { userId: 55 ... }}
В Ngrx есть 2 пути создания экшенов:
- Использование функции createAction
- Использование класса (подход применяется в версии ngrx 7 или ниже)
Создание экшена с помощью createAction является рекомендуемым*.
Создание экшена с помощью класса выглядит следующим образом:
Как уже не сложно заметить, использование класса существенно увеличивает количество кода при одном action’е.
Если исходить из практики, то нужно отметить пару вещей:Важны правильные названия для Action’ов, так как халатное отношение к наименованию, может привести к замешательству разработчика и породить множество нежелательных side эффектов. Например использование грамматики в наименовании (LoadX, LoadingX, LoadedX) как правило не только мешает, но не даёт чёткого ответа на тип Action’а. Есть множество действий (неправильных глаголов), которые не имеют второй/третьей формы и поэтому, для описания подобного рода экшенов, приводит разработчика к придумыванию решений (костылей), которые могли бы отражать суть экшена. Подобный подход был представлен разработчиками Nx, хотя и возможно они просто использовали примеры Ngrx.
Важны правильные названия для Action’ов, так как посредственное отношение к наименованию, может привести к замешательству разработчика и породить множество нежелательных side эффектов. Например использование грамматики в наименовании (LoadX, LoadingX, LoadedX) как правило не только мешает, но не даёт чёткого ответа на тип Action’а. Есть множество действий (неправильных глаголов), которые не имеют второй/третьей формы и поэтому, для описания подобного рода экшенов, приводит разработчика к придумыванию решений (костылей), которые могли бы отражать суть экшена
Подобный подход был представлен разработчиками Nx, хотя и возможно они просто использовали примеры Ngrx.
Хоть и с первого взгляда, создание action’ов с помощью классов привлекает внимание сторонников ООП, практика показывает, что использование enum будет нужно только для создания action’а и его связи с reducer’ом. Однако, поддержка enum’а и порождение классов существенно увеличивают время и размер store, что как правило, не является оправданным.
Как записать Экшин (Action)?
Запись Action-а, обычно, начинают с создания папки для однотипных экшинов, чтобы вновь созданный экшин не затерялся среди остальных.
Создать папку можно, нажав на соответствующую иконку, либо через меню палитры командой New Set.
Давайте папке осмысленное название, так как сохранить экшины отдельно от Photoshop-а, можно только целиком, вместе с папкой.
Точно так же, нажав на иконку или выбрав в меню палитры команду New Action, создаётся и новый экшин. Лучше, чтобы имя экшина указывало на операцию, которую экшин выполняет.
После нажатия на кнопку Record, начнётся запись, которую, впрочем, можно сразу остановить, если Вы ещё не готовы.
Работает палитра Actions как обычный диктофон. При нажатии на кнопку Begin recording, все наши действия начинают записываться.
Если что-то пошло не так, всегда можно остановить запись кнопкой Stop playing и откатиться назад, удалив неправильно выполненные действия. Затем можно снова продолжить запись.
Запись Action-а можно редактировать. Команды можно менять местами, так же как и слои в палитре Layers, или удалять, перетащив мышкой в корзину.
Удалив команду, её всегда можно записать заново.
Когда Экшин записан, его можно запустить кнопкой Play selection, и он произведёт записанные ранее действия над активным изображением.
Для удобства использования Action-ов, можно назначить каждому экшину одну из функциональных клавиш F2… F12 или комбинацию клавиш Shift+F2, Ctrl+F2, Shift+Ctrl+F2 и т.д. Итого 44-ре комбинации.
Если переключить палитру Actions в Button mode, то запускать экшины мышкой будет удобнее.
Собственно, любой набор действий, описанных в предыдущих параграфах, можно записать в качестве Action-а.
Нужно только иметь в виду, что состояние опции Resize Image During Paste/Place в Action не записывается. Если случайно в настройках снять птицу из чекбокса этой опции, то Action будет работать неправильно. Изображение логотипа или водяного знака не будет подгоняется под размер целевого изображения. А если размер шаблона был большим, то Photoshop «скушает» лишний гигабайт оперативной памяти под этот процесс, да и выполнять его будет слишком долго. В общем, если Вы заметите нечто подобное при запуске Action-а, проверьте состояние этой опции.
Если Вы захотите использовать готовые Экшины из «Дополнительных материалов», то Вам придётся в них переписать команды Place и Paste. Для этого можно два раза кликнуть по команде Place или Paste, а затем указать директорию, в которую Вы поместили шаблон своего водяного знака или логотипа. Можно и вовсе удалить команду, которая требует редактирования, и вместо неё записать новую.
Когда Action записан, то его можно применить не только к изображению на рабочем столе Photoshop-а, но и к целой группе картинок, расположенных в отдельной папке или директории. Для этого нужно выбрать либо команду File > Automate > Batch, либо File > Scripts > Image Processor и добавить туда нужный Action.
Общие сведения об Actions (Операции)
Actions (Операции) – это последовательность действий, которые можно записывать, редактировать, настраивать, и использовать много раз.
В программе Photoshop есть готовые встроенные операции для выполнения наиболее часто встречающихся задач. Эти операции можно использовать как есть, изменить их в соответствии с вашими требованиями или создать и сохранить новые операции.
Операции хранятся в наборах, что весьма удобно в работе.
Операции могут содержать точки остановок, которые позволяют выполнять задачи, которые не могут быть записаны (например, при использовании инструментов рисования).
Операции могут содержать модальные элементы управления, позволяющие вводить значения в диалоговом окне во время выполнения операции.
Как вставать логотип фиксированного размера в изображение?
Чтобы сохранить масштаб изображения при использовании команды Place, нам пришлось бы подогнать разрешение целевых картинок под разрешение нашего логотипа фиксированного размера.
Делается это при помощи инструмента Image > Image Size (Ctrl+Alt+I) со снятой «птицей» в чекбоксе Resample Image. Например, можно выбрать 72 ppi.
Однако если все картинки имеют разное разрешение, которое менять нежелательно, то можно вместо команды Place использовать команду Paste.
При использовании команды Paste, запись Action-а немного изменится.
Загружаем на рабочий столе целевое изображение.
Выбираем команду File > Open (Ctrl+O) и указываем месторасположения нашего логотипа фиксированного размера.
Выделяем изображение логотипа Select > All (Ctrl+A).
Копируем изображение логотипа в буфер обмена Edit > Copy (Ctrl+C).
Закрываем изображение логотипа File > Close (Ctrl+W).
Вставляем изображение логотипа из буфера обмена в целевую картинку Edit > Paste (Ctrl+V).
На всякий случай очищаем буфер обмена Edit > Purge > Clipboard, игнорируя предупреждение о невозможности отката назад.
Приостанавливаем запись и добавляем сверху логотипа пустой слой (Ctrl+Shift+Alt), а затем включаем запись. Это нужно только для правильной записи очередной команды.
Это можно сделать и перед началом записи экшнина, просто мне показалось, что так будет нагляднее.
Переносим вновь созданный слой наверх Layer > Arrange > Bring to Front (Shift+Ctrl+]).
Эта команда сделает Action более универсальным. Например, если «натравить» Action на многослойное изображение, у которого активный слой будет где-нибудь в середине или внизу, то логотип может оказаться скрытым под верхними слоями. Да, и логичнее будет поместить его сверху, ведь обычно логотип вставляют в самом конце обработки изображения.
Выделяем всё изображение Select > All (Ctrl+A).
Это нужно для того, чтобы показать инструменты Move Tool границы изображения. Приём сработает даже тогда, когда все слои прозрачные.
Активируем инструмент Move Tool (V).
Используя панель управления инструментом Move Tool, определяем место, относительно которого в дальнейшем будем позиционировать логотип. В данном случае был выбран правый нижний угол.
Выделенным на скриншоте кнопкам соответствуют команды Layer > Align Layers to Selection > Bottom Edges и Layer > Align Layers to Selection > Right Edges.
Последовательность выполнения этих команд произвольная.
Скрываем селекцию Select > Deselect (Ctrl+D).
При помощи инструмента Filter > Other > Offset задаём расстояние от логотипа до краёв основного изображения.
Положение переключателя Undefined Areas произвольное (он предназначен для работы с выделенными частями изображения).
Наименование Action’ов
Файл user.actions.ts:
Как можно увидеть, в файле создано 3 action’а:
- loadUser
- loadUserSuccess
- loadUserFailure
Важным нюансом тут является наименование action’ов, где используется следующая парадигма:
Действие — Сущность — Состояние/Статус
Данная модель наименования объясняется следующим образом.
Допустим есть множество действий, которые необходимо совершить с сущностью: create, change, update, load, merge, delete, migrate, reset, confirm, …
И если не придерживаться какой-то логики, с помощью которой можно идентифицировать цепочку событий, то поддержка подобного рода state’а превращается в очень сложную задачу.
Возьмём для примера 3 действия для user’а: create, delete, change.
Хоть случай и надуманный, но уже вызывает некоторое отвращение.
Такая же проблема была и раньше в Nx и Ngrx. Если посмотреть примеры action’ов в Ngrx, то можно было увидеть нечто подобное:
Даже если абстрагироваться от стиля написания и переписать в упрощённом виде:
Для избежания описанных выше проблем, предлагается использовать модель действие-сущность-состояние.
Обычно в проекте присутствуют группы action’ов, из которых выстраивается цепочка событий. Например, загрузка авторизированного пользователя.
Опишем всю цепочку:
- Инициировать событие, которые вызовет загрузку пользователя — loadUser
- После успешной загрузки пользователя, вызвать событие сохранения загруженного пользователя в state — loadUserSuccess
- Если при загрузке пользователя произошла ошибка, вызвать событие ошибки загрузки (для того, чтобы показать ошибку клиенту) — loadUserFailure.
Обычно, данной цепочки хватает, для реализации. Но чем сложнее логика, тем больше может становиться цепочка. Например, если вы используете SSR, и не хотите загружать предварительные данные, а оставить это на уровне browser.app. Тогда нужна ещё одна стадия — проверка возможности загрузки:
- Вызов события, которое проверит возможность загрузки пользователя и вызовет событие загрузки — loadUser
- Инициировать событие, которые вызовет загрузку пользователя — loadUserRun
- После успешной загрузки пользователя, вызвать событие сохранения загруженного пользователя в state — loadUserSuccess
- Если при загрузке пользователя произошла ошибка, вызвать событие ошибки загрузки (для того, чтобы показать ошибку клиенту) — loadUserFailure.
Также этот пример, может обрабатывать случай, когда вызвана повторная загрузка пользователя, хотя первая попытка ещё не завершилась.
Для того, чтобы отлавливать подобные случаи, можно добавить состояние cancel:
- Вызов события, которое проверит возможность загрузки пользователя и вызовет событие загрузки — loadUser, если загрузка не возможно вызвать событие loadUserCancel
- Инициировать событие, которые вызовет загрузку пользователя — loadUserRun
- После успешной загрузки пользователя, вызвать событие сохранения загруженного пользователя в state — loadUserSuccess
- Если при загрузке пользователя произошла ошибка, вызвать событие ошибки загрузки (для того, чтобы показать ошибку клиенту) — loadUserFailure.
Приведём реализацию:
Как можно заметить, мы однозначно можем выстроить цепочку, так как все action’ы начинаются одинаково с loadUser, а все состояния различны. Это очень удобно при использовании IDE, где при авто подсказках, все ваши action’ы выстроены друг под другом.
Вынесение данных из action’а в payload
Последним, что можно сказать об организации action’ов, это правила передачи параметров в action.
Так как createAction, формально создаёт новый объект со свойством type и всеми остальными свойствами, переданными в props, то получается непреднамеренное объединение двух разных составляющих Redux.
Рассмотрим проблему на примере.
Допустим необходима загрузка пользователя по id. Для этого в action добавим параметр.
Однако, результатом работы будет action вида:
И в этом нет ничего плохого. Но если вы решите передавать payload между action’ами, то тогда, будет необходимо дублировать и указывать все переданные параметры. В нашем случае это один параметр:
Однако, этого можно избежать, если использовать подход вынесения данных в payload. Вместо того, чтобы передавать набор свойств в action, передавать туда объект, который внутри себя будет хранить все параметры:
Это позволяет в выше описанном случае, просто передать весь payload целиком, без ненужного присваивания каждого из свойств payload’а.
Тогда, согласно описанному подходу, action’ы для пользователя будут выглядеть так:
где ActionPropsPayload простая абстракция для создания объекта со свойством payload.
Action Plan в постановке долгосрочных задач
Долгосрочное планирование на год – первый этап в определении квартальных и ежемесячных KPI. Action Plan позволяет добавить понедельный и ежедневный контроль. Этот инструмент поможет вам выйти из кризиса, когда нужно менять стратегию, повысить продажи, если вы наблюдаете стагнацию и уменьшение притока клиентов. При создании глобального плана на год нужно выполнить ряд подготовительных работ:
- SWOT-анализ;
- стратегия;
- определение инструментов для ее реализации;
- согласование бюджета;
- постановка SMART-цели.
SWOT-анализ позволяет эффективно исследовать внутреннюю среду вашей компании – сильные и слабые стороны (Strengths, Weaknesses); внешнюю среду – возможности и угрозы (Opportunities, Threats). Для постановки годовой SMART-цели отделу продаж нужно проанализировать внутренние бизнес-процессы, маркетинговую стратегию, конкурентов, возможные пути развития на рынке с учетом ситуации в мире.
Детальный анализ поможет разработать стратегию и понять, какие инструменты вам действительно нужны для повышения продаж. Для внутреннего аудита отдела продажа поговорите с менеджерами, узнайте, какие проблемы есть у отдела, что именно нужно сделать для повышения эффективности и запросите отчеты. Получить релевантные статистические данные и информацию о ситуации на рынке можно у консалтинговой фирмы.
На основании этого анализа можно составлять дальнейшую стратегию развития, планировать бюджет, инструменты реализации и установить ожидания по прибыли за год. Так мы подходим к постановке SMART-цели.
SMART-цель – это четко сформулированная релевантная цель. Только на первый взгляд кажется, что поставить цель проще простого. Сравните формулировки:
- повысить продажи за год;
- повысить продажи за год на 30 %;
- повысить продажи за год на 30 % с помощью внедрения технологии /наименование/ в отдел продаж. Для ее внедрения мы выделим ххх тыс. руб. Мы это делаем, потому что 67 % компаний в нашей нише внедрили эту технологию полгода назад и добились перевыполнения KPI. должны быть одними из первых. Лучшие работники получат премию в размере ххx руб. По результатам годовых отчетов мы поощрим трех лучших продажников. А также введем систему мотивации за выполнение ежеквартальных и ежемесячных планов.
Это условный пример, но он показывает главное: первая цель – размытая, а последний вариант включает конкретные шаги. SMART-цель обязательно нужно проработать для создания эффективного Action Plan отдела. Она должна быть:
- четкой – действия, кто будет делать;
- измеримой – отчетность и поэтапный показатели эффективности в цифрах;
- мотивирующей – заинтересованность команды в достижении;
- согласованной – SMART-цель должна пересекаться с другими задачами и целями, которые стоят перед отделом, и не мешать их выполнению;
- с определенным сроком – без строгих дедлайнов ничего не получится.
Как рассчитать план продаж для каждого месяца? К примеру, ожидаемый прирост прибыли за год составляет 80 млн рублей. Разделите эту сумму на 4 – столько ваш отдел продаж должен принести за квартал. Еще на 4 – необходимая сумма в месяц для достижения результата.
Когда анализ проведен и цели поставлены, можно приступить к разработке стратегии. Это и будет наш Action Plan. Определяем глобальные действия и мероприятия на год. Распределяем их по кварталам, месяцам, неделям. Недельный план делится на 7 дней. В результате у нас есть готовый план на любой день в году, нужно только вносить коррективы по ситуации, и подробный инструмент аналитики эффективности.
Главный плюс Action Plan – разделяя глобальные задачи на шаги, вы создаете поэтапный план достижения целей. Так вы не упустите ничего и точно придете к ожидаемому результату.
Создание Facade
Заключающим моментом является создание facade. Формльно фасад представляет обёртку над store и скрывает всю реализацию (dispatch, select) store.
В нашем случае фасад для User State будет следующим:
То есть для каждого значения из state, мы использовали соответствующий selector.
user$ = this.store.pipe(select(UserSelectors.getUser));userLoadError$ = this.store.pipe(select(UserSelectors.getUserLoadError));userLoadRun$ = this.store.pipe(select(UserSelectors.getUserLoadRun));
Также, для всех цепочек событий, мы написали инициаторы данных событий.
loadUser(force?: boolean): void { this.store.dispatch(UserActions.loadUser({ payload: { force } }));}
Так как весь Angular построен на абстракциях, а Facade это сервис, создадим абстракцию и для фасада:
И добавим его в реализацию фасада:
Тестирование
Запустим в нашем демо проекте:
yarn run backend:db:start // запуск сервера баз данныхyarn run serve:backend:api // запуск бекенд приложения с grpahqlyarn run redux:serve // запуск angular приложения
Так как авторизация реализована с помощью авторизационного токена, то сначала нужно авторизироваться, а затем запросить информацию о текущем пользователе.
Откроем приложение в браузере:
Попытаемся загрузить пользователя, без авторизации:
Как видно на скриншоте, произошло 3 action’а:
- LoadUser — нажатие на кнопку загрузить текущего пользователя
- LoadUserRun — загрузка пользователя с помощью API
- LoadUserFailure — ошибка загрузки пользователя
Если открыть ответ, то можно увидеть 401 статус:
Нажмём на кнопку авторизации, где произойдёт установка логина и пароля:
Видим, что произошло ещё 4 action’а:
- SignInSet — установка логина и пароля для запроса
- SignIn — запуск авторизации
- SignInRun — запрос на авторизацию по API
- SignInSuccess — успешная авторизация
Если открыть вкладку network, то можно увидеть ответ сервера:
Авторизация вернула JWT access token. Теперь можем запросить текущего пользователя:
Видим снова 3 action’а, но только теперь загрузка прошла успешно.
Как можно убедиться, GraphQL API вернула информацию по текущему, авторизированному пользователю.
И чтобы развеять сомнения, что я отлично пользуюсь Photoshop (или конечно gimp, так как на unix есть проблемы с запуском photoshop), небольшая демонстрация работы целиком:
Резюме
В данной статье рассмотрели два основных блока:
- Принципы создания state с помощью Ngrx
- Принципы организации state’ов в Ngrx и Nx.
В первом блоке детально разобрали создание следующих сущностей:
Рассмотрели создание action’ов, поговорили о старом и новом подходах, а также обсудили важность наименования action’ов, привели примеры создания экшенов;
Рассмотрели создание редьюсера, поговорили о основных компонентах редьюсера, привели примеры создания редьюсера старым и новым подходами;
Рассмотрели создание селекторов, привели примеры создания селекторов
Рассмотрели создание эффектов, поговорили об основных назначениях эффектов, привели примеры создания.
Во-втором блоке поговорили о общих подходах создания Ngrx State.
По частям разобрали и прокомментировали создания сущностей:
Рассмотрели примеры наименования экшенов, а также привели рекомендации по созданию action’ов;
Рассмотрели примеры организации State’а, а также предоставили комментарии по созданию мутаций;
Рассмотрели примеры организации эффектов в Ngrx. Поговорили о DataPersistence и привели несколько примеров для упрощения создания и управления событиями;
Рассмотрели примеры создания facade
Поговорили о важности применения фасадов и привели примеры использования.
В третьей части статьи, запустили часть приведённых примеров, для демонстрации работоспособности выше описанных подходов.
Исходники
Все исходники находятся на github, в репозитории:
Для того, чтобы посмотреть состояние проекта на момент написания статьи, нужно выбрать соответствующий тег — nx-state.
git checkout nx-state
Код можно посмотреть в разделе https://github.com/Fafnur/medium-stories/tree/master/libs/users
Для демо проекта, использовалось приложение из предыдущей статьи — redux — https://github.com/Fafnur/medium-stories/blob/master/apps/frontend/redux
Ссылки
Подписывайтесь на блог, чтобы не пропустить новые статьи про Angular и новости из мира фронтенд разработки.
Medium: https://medium.com/fafnurДобавляйтесь в группу ВК: https://vk.com/fafnurДобавляйтесь в группу в Fb: Телеграм канал: https://t.me/f_a_f_n_u_rTwitter: Instagram: https://www.instagram.com/fafnur
Предыдущие статьи:
Экшен Skitalets Original Resolution Sharpen v.6.7
В результате работы экшена образуется до 3 групп слоев, в зависимости от редакции.
Micro Contrast — зеленая группа слоев. Образуется только при использовании Full редакции. В других редакциях отсутствует.
В группе находится 2 слоя, Micro Contrast Light и Micro Contrast Dark, с отключенными по умолчанию масками. Слои раздельно регулируют светлые и темные ореолы. Группа используется для дополнительного усиления текстур и подчеркивания крупных деталей в изображении. По умолчанию видимость группы отключена. Степень воздействия регулируется непрозрачностью группы. В случае необходимости более тонкой настройки, слои в группе настраиваются раздельно. При усилении шумов можно активировать отключенные маски слоев, либо применить пользовательскую маску ко всей группе.
Textures — желтая группа слоев. Образуется при использовании Full и Standart редакций. В редакции Mini отсутствует.
В группе находится 2 слоя, Textures Light и Textures Dark. Слои раздельно регулируют светлые и темные ореолы. Группа используется для усиления и прорисовке малоконтрастных текстур, что придает изображению дополнительный микрорельеф. По умолчанию видимость группы отключена. Степень воздействия регулируется непрозрачностью группы. В зависимости от характера изображения, оптимальная непрозрачность группы может варьировать в широких пределах и каждый раз должна подбираться индивидуально. В случае необходимости более тонкой настройки, слои в группе настраиваются раздельно.
Эта группа слоев может усиливать шум на однородных поверхностях. В таких случаях рекомендуется применять пользовательскую маску ко всей группы.
Original Resolution Sharpen — красная группа слоев. Основная группа, непосредственно повышающая резкость в изображении. Образуется во всех редакциях.
В группе находится 3 пары слоев. Deconvolution ACR Light и Deconvolution ACR Dark, Sharpen Light и Sharpen Dark, Sharpen Fine Light и Sharpen Fine Dark. Каждая пара раздельно регулируют светлые и темные ореолы.
Sharpen Light и Sharpen Dark — основная пара слоев, отвечающая за повышение резкости. По умолчанию маски отключены.
Sharpen Fine Light и Sharpen Fine Dark — вспомогательная пара слоев усиливающая резкость самых мелких деталей в изображении. По умолчанию маски отключены.
Deconvolution ACR Light и Deconvolution ACR Dark — дополнительная пара слоев улучшающая восстановление размытых контуров крупных деталей изображения.
Степень повышения резкости регулируется изменением прозрачности всей группы. В случае необходимости более тонкой настройки, слои в группе настраиваются раздельно. Путем изменения их непрозрачности, включения имеющихся масок, или использования других, а также, изменения параметров Blend If в стиле слоя.
Помимо указанных групп слоев, в результате работы экшена образуется дополнительный слой Noise Reduce и 2 канала Landscape и Portrait.
Слой Noise Reduce используется для общего снижения шумов. При необходимости, в случае излишнего сглаживания, можно понизить его непрозрачность, или отключить полностью.
Каналы Landscape и Portrait используются, как резервные. Их можно использовать в качестве масок для пейзажных, или портретных снимков, соответственно.
Загрузка набора операций
По умолчанию в палитре Actions (Операции) отображаются предопределенные операции (поставляются вместе с приложением) и любые созданные операции. Туда можно также загружать дополнительные операции, скачанные с разных сайтов. Операции можно переносить на другие компьютеры так же, как кисти, фильтры или стили. Файлы операций имеют расширение *.atn.
2 способа загрузки операций:
1. В меню палитры Actions (Операции) выберите пункт Load Actions (Загрузить операции). Найдите и выберите файл набора операций, а затем нажмите кнопку Load.
2. Обычно файлы набора операций хранятся в папке С:\ProgramFiles\Adobe\Photoshop\Presets\Photoshop
Actions. Переместите туда скачанный файл с расширением *.atn и вы увидите операции в палитре Actions
(Операции).
10 советов по созданию calls-to-action, перед которыми ваши клиенты не смогут устоять
1. Помните о вашей целевой аудитории
Создать call-to-action не значит сформулировать предложение и ждать, что кто-то согласится. Это значит, что вы создаете контент, который ценен для каждого клиента, которого вы хотите привлечь.
Поэтому необходимо узнать, что нужно вашей целевой аудитории, каковы ее интересы и желания, сегментировать их и создать calls-to-action на их основе. Подумайте о том, что результатом повышения привлекательности контента будет увеличение числа конверсий.
2. Упростите и соблазните
Скажите своей аудитории, что делать, используя повелительное наклонение и восклицательные или вопросительные предложения.
Недостаточно просто сказать, что делать: нужно сделать предложение соблазнительным.
Вместо “register on PayPal”, которое можно бы было использовать в этом случае, компания выбрала “sign up for free», сопроводив эту фразу другими призывами к действию, например, фото.
3. Дайте им причину сказать «да, я хочу»
Подумайте, почему клиенту должно понравится ваше предложение. Все время задавайте себе этот вопрос по мере работы над call-to-action и подчеркните сильные стороны вашего продукта/сервиса.
4
Цифры привлекают внимание, используйте их. Цифры – прекрасный способ привлечения внимания
Они всегда работают, потому что демонстрируют именно то, что важно для клиента
Цифры – прекрасный способ привлечения внимания
Они всегда работают, потому что демонстрируют именно то, что важно для клиента
Например, если вы предлагаете электронную книгу, укажите количество страниц, полезных техник, о которых они узнают, и реальную цену рядом с актуальным предложением.
Tripadvisor использует различные цифры на своей лэндинговой странице.
5. Создайте иллюзию срочности
«Подпишись сейчас» – это не то же самое, что «вы можете подписаться в любое время». Люди скорее перейдут к действиям, если существует лимит или ограничение по времени или наличию товаров.
6. Поработайте над дизайном
Если ваш призыв к действию – это кнопка или баннер, поработайте над хорошим дизайном, который выделяется на общем фоне: использование голубого и оранжевого цветов может давать совершенно разные результаты. Попробуйте различные варианты.
Инструмент ButtonOptimizer поможет вам создать дизайн call-to-action, а наша инфографика – не ошибиться в выборе цвета.
7. Выберите оптимальное расположение
Неважно, где вы собираетесь использовать кнопку call-to-action – на веб-сайте, в статье, публикации в Facebook – если она расположена в неудачном месте, вы упускаете возможность увеличить конверсии
8. Не перебарщивайте
Создание разных призывов к действию на одной странице сайта или в рамках одной статьи/публикации может сбить пользователей с толку. Сосредоточьтесь на одной цели, и поработайте над call-to-action, который поможет ее достигнуть.
9. Используйте слова, которые действуют
Calls-to-action – это не магия. Это формулы, которые можно применять. Одна из них – это выбор правильных ключевых слов, которые работают лучше других.
Некоторые из слов, которые работают лучше всего: «начни», «узнай», «открой», «хотите…?», «вам нужно…?», «бесплатный», «попробуйте».
10. Используйте стрелки
Использование стрелок, указывающих на кнопки call-to-action, – это хороший прием для привлечения внимания пользователей к этой кнопке. Так вы сможете быть уверены, что пользователи заметят кнопку.
И теперь все зависит от того, насколько привлекательна эта кнопка.
Советы:
Первым шагом каждой операции делайте новый снимок в палитре History.
При создании экшена всегда давайте новым слоям и каналам конкретные имена, лучше латиницей. Это нужно для того, чтобы при использовании созданного набора операций для другого изображения или при работе на другом компьютере не возникали ошибки (типа в английской версии фотошопа не задавалось имя Слой1 русскими буквами или задавалось по умолчанию имя Layer1 для слоя тогда как слой с таким именем уже есть).
Некоторым командам можно задать дополнительные параметры. В экшене сохраняются те значения, которые вы задали в диалоговом окне при записи операции. Но при выполнении записанного набора эти значения могут не
подходить и их нужно изменить. Например, параметры для фильтров. Чтобы при выполнении нужной команды, фотошоп открывал диалоговое окно для ввода значений. щелкните на пустом прямоугольнике слева от имени команды. Появится пиктограмма, изображающая диалоговое окно. Теперь когда фотошоп дойдет до выполнения этой команды откроется диалоговое окно и вы сможете, если нужно, ввести желаемые параметры.