Почему содержимое дочернего компонента с реквизитами не отображается на странице?

#vue.js #vuejs3

#vue.js #vuejs3

Вопрос:

В приложении vuejs3 я считываю данные с помощью запроса axios из внутреннего API. Я вижу, что данные передаются внутреннему компоненту, но я не вижу, чтобы содержимое дочернего компонента отображалось на странице.

Родительский компонент:

 <template>
      <div class="row m-0 p-0" v-show="forumCategories.length amp;amp; isPageLoaded">
        <div v-for="(nextActiveForumCategory, index) in forumCategories" :key="nextActiveForumCategory.id" class="col-sm-12 col-md-6 p-2 m-0">
          index::{{ index}}
          <forum-category-block
            :currentLoggedUser="currentLoggedUser"
            :nextActiveForumCategory="nextActiveForumCategory"
            :index="index"
            :is_show_location="true"
          ></forum-category-block>
        </div>
      </div>
</template>

<script>
  import ForumCategoryBlock from '@/views/forum/ForumCategoryBlock.vue'
  import { useStore } from 'vuex'

  export default {
    
    name: 'forumsByCategoryPage',

    components: {
      ForumCategoryBlock,
    },

    setup () {
      const store = useStore()
      const orderBy = ref('created_at')
      const orderDirection = ref('desc')

      const forumsPerPage = ref(20)
      const currentPage = ref(1)
      let forumsTotalCount = ref(0)
      let forumCategories = ref([])
      let isPageLoaded = ref(false)
      let credentialsConfig = settingCredentialsConfig

      const currentLoggedUserToken = computed(
        () => {
          return store.getters.token
        }
      )

      const currentLoggedUser = computed(
        () => {
          return store.getters.user
        }
      )
      
      const forumsByCategoryPageInit = async () => {
        loadForums()
      }
      
      function loadForums() {
        isPageLoaded = false
        let credentials = getClone(credentialsConfig)
        credentials.headers.Authorization = 'Bearer '   currentLoggedUserToken.value
        let filters = { current_page: currentPage.value, order_by: orderBy.value, order_direction: orderDirection.value }
        const apiUrl = process.env.VUE_APP_API_URL

        axios.get(apiUrl   '/forums-by-category', filters, credentials)
          .then(({ data }) => {
            console.log('/forums-by-category data::')
            console.log(data)

            forumCategories.value = data.forumCategories
            forumsTotalCount.value = data.forumsTotalCount
            isPageLoaded = true
            console.log('  forumCategories::')
            console.log(forumCategories)
          })
          .catch(error => {
            console.error(error)
            isPageLoaded = true
          })
      } // loadForums() {

      onMounted(forumsByCategoryPageInit)
      
      return {
        currentPage, orderBy, orderDirection, isPageLoaded, loadForums, forumCategories, getHeaderIcon, pluralize, forumsTotalCount, forumCategoriesTitle, currentLoggedUser
      }
    } // setup
</script>
  

и ForumCategoryBlock.vue :

 <template>
  <div class="">
    <h1>INSIDE</h1>
    <fieldset class="bordered" >
      <legend class="blocks">Block</legend>
      nextActiveForumCategory::{{ nextActiveForumCategory}}<br>
      currentLoggedUser::{{ currentLoggedUser}}<br>
      index::{{ index }}<br>
    </fieldset>
  
  </div>
</template>

<script>
  import { computed } from 'vue'
  export default {
    name: 'forumCategoryBlock',

    props: {
      currentLoggedUser: {
        type: Object,
        default: () => {}
      },
      nextActiveForumCategory: {
        type: Object,
        default: () => {}
      },
      index: {
        type: Number,
        default: () => {}
      }
    },

    setup (props) {
      console.log('setup props::')
      console.log(props)
      const nextActiveForumCategory = computed({
        get: () => props.value.nextActiveForumCategory
      })
      const currentLoggedUser = computed({
        get: () => props.value.currentLoggedUser
      })
      const index = computed({
        get: () => props.index
      })
      return { /* currentLoggedUser, nextActiveForumCategory, index */ }
    }

  }
</script>
  

Что я вижу в браузере: https://prnt.sc/vh7db9

Что не так и как это исправить?

ИЗМЕНЕНО: я понял, ГДЕ ошибка :

   <div class="row m-0 p-0" v-show="forumCategories.length  amp;amp; isPageLoaded" style="border: 2px dotted red;">
  

если удалить 2-е условие amp;amp; isPageLoaded в строке выше, я вижу содержимое.

Но похоже, что var isPageLoaded не реагирует, и я не понимаю, почему? If объявляется с помощью ref и объявляется взамен метода setup . Но похоже, что, когда я изменяю его в методе loadForums, он не работает в шаблоне… Спасибо!

Ответ №1:

isPageLoaded теряет свою реактивность, потому loadForums() что меняет свой тип с ref на Boolean :

 isPageLoaded = true // ❌  no longer a ref
  

isPageLoaded является a ref , поэтому ваш код должен получить к нему доступ через его value свойство. Вероятно, лучше использовать const вместо let here, чтобы избежать этой ошибки:

 const isPageLoaded = ref(false)
isPageLoaded.value = true // ✅