Переменные

Чтобы использовать переменные, объявите их в отдельном блоке variables в корне карточки. При объявлении переменной укажите параметры:

  • name — имя, может состоять из латинских букв разных регистров, цифр и символов _ и .. Не может начинаться с цифры или с точки.
  • type — тип переменной. См. Типы данных.
  • value — значение по умолчанию.

Например:

{
    "variables": [
        {
            "name": "subscribed",
            "type": "boolean",
            "value": true
        }
    ],
}
  1. Типы данных
  2. Нелокальные переменные
  3. Изменение значений переменных
  4. Выполнение действий при изменении значений переменных
  5. Узнать больше

Типы данных

Поддерживаемые типы данных:
  • логический: boolean
  • строковый: string
  • целочисленный: integer
  • число с плавающей точкой: number
  • цвет: color
  • ссылка на ресурс: url
Примеры объявления переменных
{
    "variables": [
        {
            "name": "subscribed",
            "type": "boolean",
            "value": true
        },
        {
            "name": "likes",
            "type": "integer",
            "value": 0
        },
        {
            "name": "black",
            "type": "color",
            "value": "#f000"
        },
        {
            "name": "username",
            "type": "string",
            "value": "unknown"
        }
    ],
    "states": [ ... ]
}

Нелокальные переменные

Переменные, объявленные в карточке, считаются локальными, и другие карточки не имеют к ним доступа. Однако возможны ситуации, когда несколько карточек должны использовать одну общую переменную. В этом случае допустимо ссылаться на необъявленные переменные. При попытке получить их значение среда выполнения сможет найти эти переменные в общем для нескольких карточек контексте, если они там объявлены. Более того, из карточки можно не только читать, но и записывать значения этих переменных.

Пример работы с нелокальными переменными на платформе Android:
import com.yandex.div.data.Variable
...

val divContext: DivContext = provideYourDivContext()
divContext.divComponent.globalVariableController.putOrUpdate(
    Variable.StringVariable(name = "user_name", defaultValue = "undefined"),
    Variable.BooleanVariable(name = "dark_theme", defaultValue = true),
    ...
)

Изменение значений переменных

Для изменения значения переменной доступно действие set_variable. Например:
div-action://set_variable?name=common_text_size&value=17

Чтобы задать значение переменной, можно использовать вычисляемые выражения и встроенные функции.

Изменить значения переменных также можно через SDK (в Android с помощью DivView#setVariable ).

Примечание. Важно, чтобы тип нового значения совпадал с типом переменной, иначе будет невозможно применить значение.

Примеры:

  • изменить значение переменной с плавающей точкой:
    div-action://set_variable?name=price&value=3.889
  • изменить значение логической переменной:
    • значение true: div-action://set_variable?name=is_liked&value=1
    • значение false: div-action://set_variable?name=is_liked&value=0
  • изменить значение переменной типа color на зеленый цвет:
    div-action://set_variable?name=color_variable&value=@{encodeUri('#ff00ff00')}

Выполнение действий при изменении значений переменных

После изменения значения переменной, кроме обновления всех свойств, в которых используется переменная, можно выполнить любое количество действий. Для этого добавьте описание триггера в блоке variable_triggers:

  • Параметр condition — условие выполнения действия. Может содержать логическое выражение с использованием переменных или события, по которым будет запущен триггер.
  • Параметр mode — определяет, в каком случае срабатывает действие:
    • on_condition — действие срабатывает, если при изменении значения переменной стало выполняться условие (до этого условие не выполнялось);
    • on_variable — действие срабатывает каждый раз, если при изменении значения переменной условие выполняется.

    Например, переменные меняются несколько раз и condition последовательно принимает значения true → true → false → true. При использовании значения on_condition действие сработает 2 раза, при использовании значения on_variable — 3 раза.

  • Параметр actions — описание действий, которые требуется выполнить при выполнении условия.

Ограничения:

  • Условия без использования переменных (к примеру "condition": "@{1 == 1}") или с функциями, не зависящими от переменных, не будут работать, так как без переменных не ясно, когда именно следует запускать проверку условия.
  • Триггер не будет срабатывать, если в условии сравниваемые между собой сущности будут иметь разные типы (к примеру, переменная логического типа сравнивается с переменной типа integer).
Например:
{
    "states": { ... },
    "variables": { ... },
    "variable_triggers": [
        {
            "condition": "@{liked}",
            "actions": [
                {
                    "url": "div-action://set_variable?name=total_likes&value=@{sum(total_likes, 1)}"
                }
            ]
        },
        {
            "condition": "@{subscribed && !liked}",
            "mode": "on_condition",
            "actions": [
                {
                    "url": "div-action://set_state?state_id=0/subscriptions/expanded"
                },
                {
                    "log_id": "common_posts_shown",
                    "url": "div-action://set_state?state_id=0/common_posts/collapsed"
                }
            ]
        },
        {
            "condition": "@{total_likes > 100 || user_name == 'John'}",
            "mode": "on_variable",
            "actions": [ ... ]
        }
  ]
}
В примере выше первый триггер будет запускать действие, которое увеличивает значение переменной total_likes каждый раз, когда значение переменной liked сменится с false на true . По такой же логике будет работать и второй триггер.

Третий триггер, благодаря параметру "mode": "on_variable", будет запускаться каждый раз при изменении значений переменных и выполнении условия в condition .

Узнать больше

Следите за новостями DivKit в Telegram-канале: http://t.me/divkit_news

Также вы можете обсуждать интересующие вас темы в сообществе пользователей DivKit в Telegram: https://t.me/divkit_community_ru

Репозиторий DivKit