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). Вимагається.
HTMLElement
app.ptr.destroy(el)
знищити екземпляр PTR
  • el - HTMLElement or string — (with CSS Selector) or object. PTR елемент (ptr-content). Вимагається..
HTMLElement
app.ptr.get(el)
отримати екземпляр PTR за елементом HTML
  • el - HTMLElement or string — (with CSS Selector). Елемент PTR (ptr-content).
HTMLElement
app.ptr.done(el)
скидання стану PTR на вказаному елементі вмісту PTR
  • el - HTMLElement or string — (with CSS Selector) Елемент PTR (ptr-content).
HTMLElement
app.ptr.refresh(el)
запускає PTR на вказаному елементі вмісту PTR
  • el - HTMLElement or string — (with CSS Selector) Елемент PTR (ptr-content). Вимагається.
HTMLElement

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

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

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

Події PTR

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

Події DOM

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

<div class="ptr-content">

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

<div class="ptr-content">

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

<div class="ptr-content">

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

<div class="ptr-content">

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

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

string
ptr:done
PTR вміст

<div class="ptr-content">

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

<div class="ptr-content">

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

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

Екземпляр PTR запускає події як у себе, так і в екземплярі застосунку. Події екземплярів застосунку мають ті самі назви з префіксом ptr.
ПодіяАргументОписТип
pullStart
(el)
Подія буде ініційована, коли ви почнете переміщати "Pull", щоб оновити вміст. Як аргумент обробник події отримує елемент PTR
undefined
ptrPullStart
(el)
Подія буде ініційована, коли ви почнете переміщати "Pull", щоб оновити вміст. Як аргумент обробник події отримує елемент PTR
undefined
pullMove
(el, data)
Подія буде ініційована, коли ви переміщуєте "Pull", щоб оновити вміст. Як аргумент обробник події отримує елемент PTR і дані PTR, що містять такі властивості:
  • event — подія touchmove
  • scrollTop — поточна верхня позиція прокрутки
  • translate — поточне зміщення translateY
  • touchesDiff — різниця дотиків (в пікселях)
undefined
ptrPullMove
(el, data)
Подія буде ініційована, коли ви переміщуєте "Pull", щоб оновити вміст. Як аргумент обробник події отримує елемент PTR і дані PTR, що містять такі властивості:
  • event — подія touchmove
  • scrollTop — поточна верхня позиція прокрутки
  • translate — поточне зміщення translateY
  • touchesDiff — різниця дотиків (в пікселях)
undefined
pullEnd
(el, data)
Подія буде ініційована, коли ви відпустите кнопку Pull, щоб оновити вміст. Як аргумент обробник події отримує елемент PTR
undefined
ptrPullEnd
(el, data)
Подія буде ініційована, коли ви відпустите кнопку Pull, щоб оновити вміст. Як аргумент обробник події отримує елемент PTR
undefined
refresh
(el, done)
Подія буде ініційована, коли PTR переходить у стан «оновлення». Як аргумент обробник події отримує елемент PTR і done функцію для скидання стану PTR
undefined
ptrRefresh
(el, done)
Подія буде ініційована, коли PTR переходить у стан «оновлення». Як аргумент обробник події отримує елемент PTR і done функцію для скидання стану PTR
undefined
done
(el)
Подія буде ініційована після того, як буде виконано pull to refresh і воно повернеться до початкового стану (після виклику ptr.done методу). Як аргумент обробник події отримує елемент PTR
undefined
ptrDone
(el)
Подія буде ініційована після того, як буде виконано pull to refresh і воно повернеться до початкового стану (після виклику ptr.done методу). Як аргумент обробник події отримує елемент PTR
undefined
beforeDestroy
(ptr)
Подія буде запущена безпосередньо перед тим, як екземпляр PTR буде знищено. В якості аргументу обробник події отримує екземпляр PTR
undefined
ptrBeforeDestroy
(ptr)
Подія буде запущена безпосередньо перед тим, як екземпляр PTR буде знищено. В якості аргументу обробник події отримує екземпляр PTR
undefined

Змінні 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>