VueJS - 如何在没有任何硬代码的情况下使组件完全动态化

Posted

技术标签:

【中文标题】VueJS - 如何在没有任何硬代码的情况下使组件完全动态化【英文标题】:VueJS - How to make components completely dynamic without any hard-code in it 【发布时间】:2021-04-18 03:13:24 【问题描述】:

嗯,我是 vuejs 的新手,我正在做一个项目,其中每个数据/内容都取自 RestAPI。所以,现在我想让我的组件完全动态化,无需任何硬编码,只需使用来自 API 的 id 并相应地显示内容。

这是我的 router.js:

 
      path: '/views/frames',
      name: 'frames',
      component: () => import('./views/frames/App.vue'),
 ,

  path: '/views/frames/:viewContentId',               <--- Dynamic routing
  name: 'letsCheck',
  component: () => import('./views/frames/Contents.vue')

这是我的 App.vue:

 <div class="vx-row">
    <div class="vx-col w-full md:w-1/2 mb-base" v-for="info in infos" :key="info.id">
          <vx-card>
        

 <div class="header">
          <div class="left">
            <img src="./img/info_8_logo.png" />                  <-- Hard_coded value ie 8
            <b>info.name</b>
          </div>
          <div class="right">
            <vs-button @click="$router.push(name: 'letsCheck', params: viewContentId: '8' ).catch(err => )">Explore</vs-button> 
                          <-- Above as a Hard-coded value ie 8 -->
              mes.this_is_showing_only_data_of_id8       
          </div>
        </div>
          </vx-card>
      </div>
    </div>

<script>
infos: [],
mes: []
...
created () 
  this.$http.get('/infos')                                           
    .then((response) =>  this.infos = response.data )
    .catch((error) =>  console.log(error) )
   
  this.$http.get('/messages/8/tick')                                  <-- Hard-coded value
    .then((response) =>  this.mes = response.data )
    .catch((error) =>  console.log(error) )


</script>

目前,从以下这些代码中,我在第一页中显示 8 张卡片,其 id=8 的内容与我在 App.vue 中硬编码的内容相同,即(mes)。但是我想在不直接使用任何 id 的情况下使其动态化,而是代码应该使用来自 API /infos 的 id,然后相应地显示内容。

并且当在 App.vue 中点击按钮时,假设用户在第三张卡片中点击了它,那么 components.vue 必须分配 id=3 并显示内容。

请帮帮我,我被困在这里了!

【问题讨论】:

【参考方案1】:

如果我理解正确,您想点击卡片以查看其详细信息。

你可以在你的 dom 中做这样的事情:


<vs-button @click="goToDetails(info.id)">Explore</vs-button> 

并在您的脚本中的同一文件中:


methods: 
 gotoDetails(id) 
      this.$router.push( name: 'letsCheck', params: id)
    


此外,如果您的 API 有一个类似于 detail 的端点,只需创建一个获取 ID 的方法(查看下面的代码)并发送您的获取请求并仅在您的组件中显示该卡。


data() 
    return 
       infoDetail: null
    
,

created () 
  this.$http.get(`/infos/$this.$route.params.id`)                                           
    .then((response) =>  this.infoDetail = response.data )
    .catch((error) =>  console.log(error) )


【讨论】:

非常感谢,我会检查一下并告诉您,我想知道另外一件事,来自 API 响应的 id 是一个数字,那么我如何将其转换为字符串并将其传递给 html 和其他脚本。 它现在在您的 infoDetail 对象中。因此,每当您想使用它时,只需使用 toString() 方法将其变为字符串【参考方案2】:

首先,您的许多问题已经在这里How do i use the id coming from the API response in other parts of HTML & Scripts in VueJS得到解答。

现在为letsCheck组件动态构建:


  path: '/views/frames/:viewContentId',               
  name: 'letsCheck',
  component: () => import('./views/frames/Contents.vue'),
  props: (route) => 
        const viewContentId = route.params.viewContentId.toString()
        return  viewContentId 
      ,

组件.vue

props: 
    viewContentId: 
      type: String,
      required: true,
    ,
  ,

然后在组件中,您可以使用viewContentId 进行任何 api 调用,这是来自路由器的 id 并动态呈现模板

【讨论】:

以上是关于VueJS - 如何在没有任何硬代码的情况下使组件完全动态化的主要内容,如果未能解决你的问题,请参考以下文章

Pygame:如何在不按任何键的情况下使精灵面对相同的方向

如何在没有固定高度的情况下使动态div溢出

如何在不设置面板标题的情况下使 p:dashboard 组件可拖动

如何在没有单击事件的情况下使特定的 TabItem 获得对 TabControl 的关注?

如何在没有合并提交或使用 CLI 的情况下使 GitHub 分叉保持最新?

如何在不需要任何重定向配置的情况下使 TCP 服务器在路由器 (NAT) 后面工作