vue.js - Vue filtering an array in for loop - Stack Overflow

I'm sure this worked in the past and wasn't complicated so I'm not sure what's goin

I'm sure this worked in the past and wasn't complicated so I'm not sure what's going wrong with this filtering in Vue3:

<script setup>
    import { ref } from 'vue'

    const faqs = [
        {
            question: 'lorem ipsum dolor sit amet, consectetur adipiscing elit. General',
            answer: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nonummy nibh euismod tincidunt. Cras dapibus. Vestibulum vel diam id diam sagittis rutrum. Donec vel neque at neque viverra tincidunt. Aliquam erat volutpat. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer euismod, ligula et volutpat malesuada.',
            category: 'cat1',
        },
        {
            question: 'lorem ipsum dolor sit amet, consectetur adipiscing elit. Advice',
            answer: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nonummy nibh euismod tincidunt. Cras dapibus. Vestibulum vel diam id diam sagittis rutrum. Donec vel neque at neque viverra tincidunt. Aliquam erat volutpat. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer euismod, ligula et volutpat malesuada.',
            category: 'cat2',
        },
        {
            question: 'lorem ipsum dolor sit amet, consectetur adipiscing elit. Personal Loan',
            answer: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nonummy nibh euismod tincidunt. Cras dapibus. Vestibulum vel diam id diam sagittis rutrum. Donec vel neque at neque viverra tincidunt. Aliquam erat volutpat. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer euismod, ligula et volutpat malesuada.',
            category: 'cat3',
        }
    ]

    const filteredFaqs = ref(faqs)

    const filtering = (e) => {
        const filterValue = e.target.value.toLowerCase()
        console.log('category being filtered:', filterValue)
        filteredFaqs.value = faqs.filter(faq => faq.category.toLowerCase().includes(filterValue))
    }
</script>

<template>

  <div class="tagFilters">
      <button id="cat1" name="cat1" value="cat1" @click="(e) => filtering(e)">cat1</button> 
      <button id="cat2" name="cat2" value="cat2" @click="(e) => filtering(e)">cat2</button> 
      <button id="cat3" name="cat3" value="cat3" @click="(e) => filtering(e)">cat3</button> 
  </div>
  
  <div class="faqList">
    <div class="accordions">
        <div class="accordion" v-for="(faq, index) in faqs" :id="faq.category" :key="index + 1">
            <input type="checkbox" :id="'faq' + (index + 1)">
            <label :for="'faq' + (index + 1)" class="accordionHeader" :id="'faq' + (index + 1)"><h4>{{ faq.question }}</h4></label>
            <div class="accordionContent">
                <p>
                    {{ faq.answer }}
                </p>
            </div>
        </div>
    </div>
  </div>
  
</template>

I'm sure this worked in the past and wasn't complicated so I'm not sure what's going wrong with this filtering in Vue3:

<script setup>
    import { ref } from 'vue'

    const faqs = [
        {
            question: 'lorem ipsum dolor sit amet, consectetur adipiscing elit. General',
            answer: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nonummy nibh euismod tincidunt. Cras dapibus. Vestibulum vel diam id diam sagittis rutrum. Donec vel neque at neque viverra tincidunt. Aliquam erat volutpat. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer euismod, ligula et volutpat malesuada.',
            category: 'cat1',
        },
        {
            question: 'lorem ipsum dolor sit amet, consectetur adipiscing elit. Advice',
            answer: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nonummy nibh euismod tincidunt. Cras dapibus. Vestibulum vel diam id diam sagittis rutrum. Donec vel neque at neque viverra tincidunt. Aliquam erat volutpat. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer euismod, ligula et volutpat malesuada.',
            category: 'cat2',
        },
        {
            question: 'lorem ipsum dolor sit amet, consectetur adipiscing elit. Personal Loan',
            answer: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nonummy nibh euismod tincidunt. Cras dapibus. Vestibulum vel diam id diam sagittis rutrum. Donec vel neque at neque viverra tincidunt. Aliquam erat volutpat. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer euismod, ligula et volutpat malesuada.',
            category: 'cat3',
        }
    ]

    const filteredFaqs = ref(faqs)

    const filtering = (e) => {
        const filterValue = e.target.value.toLowerCase()
        console.log('category being filtered:', filterValue)
        filteredFaqs.value = faqs.filter(faq => faq.category.toLowerCase().includes(filterValue))
    }
</script>

<template>

  <div class="tagFilters">
      <button id="cat1" name="cat1" value="cat1" @click="(e) => filtering(e)">cat1</button> 
      <button id="cat2" name="cat2" value="cat2" @click="(e) => filtering(e)">cat2</button> 
      <button id="cat3" name="cat3" value="cat3" @click="(e) => filtering(e)">cat3</button> 
  </div>
  
  <div class="faqList">
    <div class="accordions">
        <div class="accordion" v-for="(faq, index) in faqs" :id="faq.category" :key="index + 1">
            <input type="checkbox" :id="'faq' + (index + 1)">
            <label :for="'faq' + (index + 1)" class="accordionHeader" :id="'faq' + (index + 1)"><h4>{{ faq.question }}</h4></label>
            <div class="accordionContent">
                <p>
                    {{ faq.answer }}
                </p>
            </div>
        </div>
    </div>
  </div>
  
</template>

It might just be something simple I overlooked but can anyone help me to understand why it's not filtering?

When the filter buttons are clicked the console log returns the intended value , and if I console log what's returned in filteredFaqs.value I can also see the correct items in the array being returned depending on which filter button is clicked.

Share Improve this question asked Nov 18, 2024 at 13:47 ChobbitChobbit 6545 silver badges17 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 1

I've already found my answer, it's because my for loop was referencing the original static array and not the reactive one I've cloned.

So the v-for="(faq, index) in faqs" should have been: v-for="(faq, index) in filteredFaqs"

I knew it would have been something simple I just missed.

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1745613078a4636065.html

相关推荐

  • vue.js - Vue filtering an array in for loop - Stack Overflow

    I'm sure this worked in the past and wasn't complicated so I'm not sure what's goin

    14小时前
    40

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信