Vue 3 Массив рендеринга массив vnodes в настройке()

#vue.js #vuejs3 #vue-composition-api

Вопрос:

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

Когда я использую массив и нажимаю или назначаю значения по умолчанию, а затем помещаю массив в функцию визуализации, я не вижу никакой реактивности при нажатии.

 setup(props, {emit, slots}) {
    const base_number = ref(1)

    const base_offset= computed(()=> { return base.value   2 })
    let buttons = [base_offset.value]

    let pageClick =  (event , pageNumber ) => {
       base_number.value = 3
    }

    return  h("ul",{ class: "pagination", 'onClick' : event => { pageClick(event, 1)}},
               buttons
            )
 

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

    //On click will update  base_offset
    return  h("ul",{ class: "pagination", 'onClick' : event => { pageClick(event, 1)}},
                      [base_offset.value]
             )

}
 

Что я упускаю и можно ли передать в массиве vnodes?

Ответ №1:

Вместо того , чтобы возвращать VNode массив напрямую setup() , он должен возвращать функцию визуализации, которая возвращает VNode массив (и вы должны увидеть предупреждение консоли браузера об этом).:

 export default {
  setup() {
    // return h(...) ❌
    return () => h(...) ✅
  }
}
 

В рамках этой функции визуализации создайте buttons массив VNodes . Обратите внимание, что VNode s, созданные вне функции визуализации, не являются реактивными.

 export default {
  setup() {
    //...

    // ❌ non-reactive buttons array
    // let buttons = [base_offset.value, base_offset.value   2, base_offset.value   4]

    return () => {
      // ✅ reactive buttons array
      let buttons = [base_offset.value, base_offset.value   2, base_offset.value   4]

      return h(
        'ul',
        {
          class: 'pagination',
          onClick: (event) => {
            pageClick(event, 1)
          },
        },
        buttons
      )
    }
  }
}
 

ДЕМОНСТРАЦИЯ