【问题标题】:Vuex get for loop id to axiosVuex获取循环ID到axios
【发布时间】:2020-07-02 12:18:42
【问题描述】:

我在从 for 循环中获取 id 然后将其插入 axios 时遇到问题。我会给你一个样品。

这是我的代码

<ul v-for="post in posts" :key="post.id">
    <li><h1>{{ post.name}} </h1></li>
      <slide v-for="(lesson, index) in lesson1" :key="index">
        <img :src="lesson.image_url">
      </slide>
    </li>
</ul>

 computed: {
    ...mapState('Gallery', ['posts',
                            'lesson1',
                            ]), 
      },
created() {
    this.$store.dispatch('Gallery/loadPosts');
    this.$store.dispatch('Gallery/loadLesson1',[1]);
}

然后在我的 VUEX 中

state: {
        posts: [],
        lesson1: [],
   },
mutations: {
    SET_POSTS(state, data) {
        state.posts = data;
    },
    LOAD_1(state, data) {
        state.lesson1 = data;
    }
  },

   actions: {
    loadPosts(ctx) {

        axios
            .get('/api/posts/', {

            })
            .then(res => {
                ctx.commit('SET_POSTS', res.data)
            })
     },
     loadLesson1(ctx, imgId) {

        axios.get('api/post/lesson/'+imgId, { 
        })
        .then(res => {
          var datas = res.data;
            ctx.commit('LOAD_1', datas)
        })
    },

我想在 for 循环中获取 id,然后将其存储在课程中,然后它将根据 id post 获取课程数据。例如,我有 10 个帖子,然后我将获得 10 个帖子 ID,然后根据帖子 ID 显示课程。请帮助提前谢谢

示例输出:

   post 1
     img1, img2, img3,  img4, img5
   post 2
     img6, img7, img8, img9, img10, img11, img12
   post 3,
     img13, img14, img15
   post 4,
     img16
   post 5,
     img17, img18, img19, img20

它就像 Netflix 画廊

请帮忙提前谢谢

【问题讨论】:

    标签: javascript vue.js axios vuex


    【解决方案1】:

    推荐getter / computed 中的 id 的基础上执行 mapping 本身即。在&lt;template&gt;中渲染数据之前

    // vuex
    getters: {
     getPosts: state => {
      return state.posts.map(post => {
       let lesson = state.lesson1.find(lesson => lesson.id == post.id)
       return { ...lesson, ...post }
      })
     }
    }
    
    // template
    <ul v-for="post in posts" :key="post.id">
     <li>
      <h1>{{ post.name}}</h1>
      <slide><img :src="post.image_url"></slide>
     </li>
    </ul>
    
    // script
    import { mapGetters } from 'vuex'
    export default {
     computed: {
      ...mapGetters(['getPosts']) // After mapping the getter, you can use `getPosts` in your template
     }
    }
    

    替代:如果id不匹配,您可以使用v-if指令来避免rendering元素。

    // template
    <ul v-for="post in posts" :key="post.id">
     <li>
      <h1>{{ post.name}} </h1>
      <template v-for="(lesson, index) in lesson1" :key="index" class="parent">
       <slide v-if="post.id == lesson.id" class="child"> <-- here
        <img :src="lesson.image_url">
       </slide>
      </template>
     </li>
    </ul>
    

    注意:Vue 不会让您将 v-forv-if 放在同一个元素上,因此将 &lt;slide&gt; 包装为 &lt;div&gt;

    【讨论】:

    • hi v-if 正在工作,但画廊的设计将不起作用。我会试试你的吸气剂。我希望它会奏效。谢谢
    • 抱歉没听懂您的意思,[1] 请澄清您的意思:画廊是设计行不通的吗?
    • 我以前试过 v-if。但画廊的设计是垂直的。它应该是水平的。我将使用你所说的吸气剂。我仍然会使用 this.$store.dispatch('Gallery/loadLesson1',[1]);?
    • 您好,请帮我完成您的 getter 代码。谢谢
    • 您可以使用 CSS / flex-box 将画廊的设计改回水平,并附上相同的示例:jsbin.com/banebukohe/edit?html,css,output
    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 2021-11-03
    • 2020-07-13
    • 2020-06-20
    • 2020-04-21
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    相关资源
    最近更新 更多