Skip to main content

Потягніть, щоб оновити

Потягніь щоб оновити (від Pull to refresh - далі "PTR") — це спеціальний компонент, який можна використовувати для ініціювання оновлення вмісту сторінки.

Макет PTR

Давайте розглянемо, як інтегрувати функцію PTR на сторінку:
<div class="page">
  <!-- Вміст сторінки повинен мати додатковий клас  "ptr-content"  -->
  <div class="page-content ptr-content" data-ptr-distance="55" data-ptr-mousewheel="true">
    <!-- попередній завантажувач pull to refresh за замовчуванням -->
    <div class="ptr-preloader">
      <div class="preloader"></div>
      <div class="ptr-arrow"></div>
    </div>

    <!-- звичайний контент нижче -->
    <div class="list">
      ...
    </div>

    <!-- вкладений елемент з прокруткою -->
    <div class="my-scolling-content ptr-watch-scrollable">
      ...
    </div>

    <!-- ще один вкладений елемент з прокруткою -->
    <div class="another-scolling-content ptr-ignore">
      ...
    </div>
  </div>
</div>
Де:

ptr-content клас. Це потрібно, щоб увімкнути функцію оновлення

div class="ptr-preloader"прихований шар із потягуванням для оновлення візуальних елементів: попереднього завантажувача та стрілки

data-ptr-distance="55"додатковий атрибут, який дозволяє встановлювати настроювану відстань спрацьовування для оновлення. За замовчуванням (якщо не вказано) це 44 пікселя

data-ptr-mousewheel="true"додатковий атрибут, який дозволяє потягнути для оновлення за допомогою коліщатка миші (для настільних застосунків). Працює тільки для PTR top.

ptr-watch-scrollable- додатковий клас, який необхідно додати до вкладених елементів, які можна прокручувати, щоб запобігти перетягування для оновлення при прокручуванні таких елементів

ptr-ignore- додатковий клас, який необхідно додати до вкладених елементів, які можна прокручувати, або інших елементів, які запобігатимуть перетягненню для оновлення при прокручуванні таких елементів або переміщенні дотиком

PTR знизу

Також можна змусити його працювати якщо тягнути знизу сторінки. У цьому випадку нам потрібно перемістити ptr-preloader елемент у нижню частину вмісту сторінки та додати додатковий ptr-bottom клас, щоб оновити вміст:
<div class="page">
  <!-- ptr-контент повинен мати додатковий клас  "ptr-bottom" -->
  <div class="page-content ptr-content ptr-bottom">
    <div class="list">
      ...
    </div>

    <!-- Pull to refresh попередній завантажувач переміщується вниз -->
    <div class="ptr-preloader">
      <div class="preloader"></div>
      <div class="ptr-arrow"></div>
    </div>
  </div>
</div>

PTR послідовність

Коли користувач починає завантажувати ptr-content , ptr-preloader отримує додатковий клас ptr-pull-down.

Коли користувач витягує ptr-content на відстань більше 44 пікселів (коли ptr-preloader буде повністю видимим), тоді ptr-preloader отримає додатковий клас ptr-pull-up , який змінює обертання стрілки, щоб сповістити користувача про дію оновлення під час випуску.

Коли користувач відпускає pull для оновлення вмісту, коли він перебуває в стані «ptr-pull-up», тоді ptr-preloader отримає додатковий клас ptr-refreshing . У стані «оновлення» стрілка буде прихована, а користувач побачить індикатор попереднього завантаження. На цьому етапі вам, ймовірно, потрібно виконати запит Ajax і оновити вміст сторінки.

Методи застосунку PTR

Є кілька методів застосунку, які можна використовувати з контейнером Pull to refresh:
МетодОпис
app.ptr.create(el)
ініціалізація PTR у вказаному контейнері елемента HTML

el - HTMLElement or string (with CSS selector) - PTR елемент (ptr-content). Вимагається.

Метод повертає створений екземпляр PTR

Використовуйте цей метод, лише якщо ви додали вміст ptr після ініціалізації сторінки або якщо ви хочете ввімкнути його пізніше. В іншому випадку, якщо на сторінці init є елемент "ptr-content", він буде створений автоматично

app.ptr.destroy(el)
знищити екземпляр PTR

el - HTMLElement or string (with CSS Selector) or object. PTR елемент (ptr-content). Вимагається..

app.ptr.get(el)
отримати екземпляр PTR за елементом HTML

el - HTMLElement or string (with CSS Selector). Елемент PTR (ptr-content).

Метод повертає екземпляр PTR

app.ptr.done(el)
скидання стану PTR на вказаному елементі вмісту PTR

el - HTMLElement or string (with CSS Selector) Елемент PTR (ptr-content).

app.ptr.refresh(el)
запускає PTR на вказаному елементі вмісту PTR

el - HTMLElement or string (with CSS Selector) Елемент PTR (ptr-content). Вимагається.

Методи та властивості PTR

Якщо ми створили PTR вручну або використовували метод app.ptr.get, ми ініціалізуємо екземпляр PTR з корисними методами та властивостями:
// ініціалізувати PTR вручну
var ptr = app.ptr.create('.ptr-content');

// або використовуючи  get щоб отримати вже створений  примірник
var ptr = app.ptr.get('.ptr-content');
Властивості
Властивість Опис
ptr.app
Посилання на глобальний екземпляр застосунку
ptr.el
Елемент PTR HTML (ptr-content)
ptr.$el
Екземпляр Dom64 з елементом PTR HTML (ptr-content)
Методи
МетодОпис
ptr.done()
Скинути стан PTR
ptr.refresh()
Активувати PTR
ptr.destroy()
Знищити екземпляр PTR і видалити обробники подій PTR із зазначеного елемента HTML

Події PTR

PTR запускатиме такі події DOM у PTR еементі та події в застосунку та PTR:

Події DOM

ПодіяОб'єктОпис
ptr:pullstart
PTR вміст

<div class="ptr-content">

Подія буде ініційована, коли ви почнете переміщати елемент "Pull", щоб оновити вміст
ptr:pullmove
PTR вміст

<div class="ptr-content">

Подія буде ініційована, коли ви переміщуєте Pull, щоб оновити вміст
ptr:pullend
PTR вміст

<div class="ptr-content">

Подія буде ініційована, коли ви відпустите кнопку Pull, щоб оновити вміст
ptr:refresh
PTR вміст

<div class="ptr-content">

Подія буде ініційована, коли PTR переходить у стан «оновлення».

event.detail метод містить ptr.done для скидання його стану після завершення завантаження

ptr:done
PTR вміст

<div class="ptr-content">

Подія буде ініційована після того, як буде виконано pull to refresh, і він повернеться до початкового стану (після виклику ptr.done методу)
ptr:beforedestroy
PTR вміст

<div class="ptr-content">

Подія буде запущена безпосередньо перед тим, як екземпляр PTR буде знищено

Події екземплярів застосунку та PTR

Екземпляр PTR запускає події як у себе, так і в екземплярі застосунку. Події екземплярів застосунку мають ті самі назви з префіксом ptr.
ПодіяАргументОписОб'єкт
pullStart
(el)
Подія буде ініційована, коли ви почнете переміщати "Pull", щоб оновити вміст. Як аргумент обробник події отримує елемент PTR
ptr
ptrPullStart
(el)
Подія буде ініційована, коли ви почнете переміщати "Pull", щоб оновити вміст. Як аргумент обробник події отримує елемент PTR
app
pullMove
(el, data)
Подія буде ініційована, коли ви переміщуєте "Pull", щоб оновити вміст. Як аргумент обробник події отримує елемент PTR і дані PTR, що містять такі властивості:

event- подія touchmove

scrollTop- поточна верхня позиція прокрутки

translate- поточне зміщення translateY

touchesDiff- різниця дотиків (в пікселях)

PTR
ptrPullMove
(el, data)
Подія буде ініційована, коли ви переміщуєте "Pull", щоб оновити вміст. Як аргумент обробник події отримує елемент PTR і дані PTR, що містять такі властивості:

event- подія touchmove

scrollTop- поточна верхня позиція прокрутки

translate- поточне зміщення translateY

touchesDiff- різниця дотиків (в пікселях)

app
pullEnd
(el, data)
Подія буде ініційована, коли ви відпустите кнопку Pull, щоб оновити вміст. Як аргумент обробник події отримує елемент PTR
PTR
ptrPullEnd
(el, data)
Подія буде ініційована, коли ви відпустите кнопку Pull, щоб оновити вміст. Як аргумент обробник події отримує елемент PTR
app
refresh
(el, done)
Подія буде ініційована, коли PTR переходить у стан «оновлення». Як аргумент обробник події отримує елемент PTR і done функцію для скидання стану PTR
ptr
ptrRefresh
(el, done)
Подія буде ініційована, коли PTR переходить у стан «оновлення». Як аргумент обробник події отримує елемент PTR і done функцію для скидання стану PTR
app
done
(el)
Подія буде ініційована після того, як буде виконано pull to refresh і воно повернеться до початкового стану (після виклику ptr.done методу). Як аргумент обробник події отримує елемент PTR
ptr
ptrDone
(el)
Подія буде ініційована після того, як буде виконано pull to refresh і воно повернеться до початкового стану (після виклику ptr.done методу). Як аргумент обробник події отримує елемент PTR
app
beforeDestroy
(ptr)
Подія буде запущена безпосередньо перед тим, як екземпляр PTR буде знищено. В якості аргументу обробник події отримує екземпляр PTR
ptr
ptrBeforeDestroy
(ptr)
Подія буде запущена безпосередньо перед тим, як екземпляр PTR буде знищено. В якості аргументу обробник події отримує екземпляр PTR
app

Змінні CSS

Нижче наведено список пов’язаних змінних CSS (спеціальні властивості CSS).
.ios {
  --t4-ptr-preloader-size: 28px;
  --t4-ptr-size: 44px;
}
.md {
  --t4-ptr-preloader-size: 22px;
  --t4-ptr-size: 40px;
}
.md,
.md .dark,
.md [class*='color-'] {
  --t4-ptr-preloader-bg-color: var(--t4-md-surface-1);
  --t4-ptr-preloader-color: var(--t4-md-primary);
}

Приклади

PTR вгорі ("top")

<template>
  <div class="page">
    <div class="navbar">
      <div class="navbar-bg"></div>
      <div class="navbar-inner">
        <div class="title">Pull To Refresh</div>
      </div>
    </div>
    <div class="page-content ptr-content" @ptr:refresh=${loadMore}>
      <div class="ptr-preloader">
        <div class="preloader"></div>
        <div class="ptr-arrow"></div>
      </div>
      <div class="list media-list">
        <ul>
          ${items.map((item) => $h`
          <li class="item-content">
            <div class="item-media"><img src=${item.picURL} width="44" /></div>
            <div class="item-inner">
              <div class="item-title-row">
                <div class="item-title">${item.song}</div>
              </div>
              <div class="item-subtitle">${item.author}</div>
            </div>
          </li>
          `)}
        </ul>
      </div>
    </div>
  </div>
</template>
<script>
  export default (props, { $update }) => {
    // Фіктивний вміст
    const songs = ['Yellow Submarine', 'Don\'t Stop Me Now', 'Billie Jean', 'Californication'];
    const authors = ['Beatles', 'Queen', 'Michael Jackson', 'Red Hot Chili Peppers'];
    let items = [
      {
        picURL: 'https://cdn.techno4.io/placeholder/abstract-88x88-1.jpg',
        song: 'Yellow Submarine',
        author: 'Beatles',
      },
      {
        picURL: 'https://cdn.techno4.io/placeholder/abstract-88x88-2.jpg',
        song: 'Don\'t Stop Me Now',
        author: 'Queen',
      },
      {
        picURL: 'https://cdn.techno4.io/placeholder/abstract-88x88-3.jpg',
        song: 'Billie Jean',
        author: 'Michael Jackson',
      },
    ]

    const loadMore = (e, done) => {
      // Емулювати завантаження 2 с
      setTimeout(() => {
        const picURL = 'https://cdn.techno4.io/placeholder/abstract-88x88-' + (Math.floor(Math.random() * 10) + 1) + '.jpg';
        const song = songs[Math.floor(Math.random() * songs.length)];
        const author = authors[Math.floor(Math.random() * authors.length)];
        // Додати новий елемент
        items.push({
          picURL,
          song,
          author,
        });

        // Оновіть стан для повторного відтворення
        $update();

        // Коли завантаження завершено, нам потрібно скинути його
        done();
      }, 2000);
    }

    return $render;
  }
</script>

PTR внизу ("Bottom")

<template>
  <div class="page">
    <div class="navbar">
      <div class="navbar-bg"></div>
      <div class="navbar-inner">
        <div class="title">Pull To Refresh Bottom</div>
      </div>
    </div>
    <div class="page-content ptr-content ptr-bottom" @ptr:refresh=${loadMore}>
      <div class="ptr-preloader">
        <div class="preloader"></div>
        <div class="ptr-arrow"></div>
      </div>
      <div class="list media-list">
        <ul>
          ${items.map((item) => $h`
          <li class="item-content">
            <div class="item-media"><img src=${item.picURL} width="44" /></div>
            <div class="item-inner">
              <div class="item-title-row">
                <div class="item-title">${item.song}</div>
              </div>
              <div class="item-subtitle">${item.author}</div>
            </div>
          </li>
          `)}
        </ul>
      </div>
    </div>
  </div>
</template>
<script>
  export default (props, { $update }) => {
    // Фіктивний вміст

    const songs = ['Yellow Submarine', 'Don\'t Stop Me Now', 'Billie Jean', 'Californication'];
    const authors = ['Beatles', 'Queen', 'Michael Jackson', 'Red Hot Chili Peppers'];
    let items = [
      {
        picURL: 'https://cdn.techno4.io/placeholder/abstract-88x88-1.jpg',
        song: 'Yellow Submarine',
        author: 'Beatles',
      },
      {
        picURL: 'https://cdn.techno4.io/placeholder/abstract-88x88-2.jpg',
        song: 'Don\'t Stop Me Now',
        author: 'Queen',
      },
      {
        picURL: 'https://cdn.techno4.io/placeholder/abstract-88x88-3.jpg',
        song: 'Billie Jean',
        author: 'Michael Jackson',
      },
    ]

    const loadMore = (e, done) => {
      // Емулювати завантаження 2 с
      setTimeout(() => {
        const picURL = 'https://cdn.techno4.io/placeholder/abstract-88x88-' + (Math.floor(Math.random() * 10) + 1) + '.jpg';
        const song = songs[Math.floor(Math.random() * songs.length)];
        const author = authors[Math.floor(Math.random() * authors.length)];
        // Додати новий елемент

        items.push({
          picURL,
          song,
          author,
        });

        // Оновіть стан для повторного відтворення
        $update();

        // Коли завантаження завершено, нам потрібно скинути його
        done();
      }, 2000);
    }

    return $render;
  }
</script>