You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VueJS中v-for结合Axios响应使用过滤器失效求助

Troubleshooting the set_marked Filter in Vue.js v-for Loop

Hey there, let's dig into why your set_marked filter is receiving an undefined value when using it with your Axios-populated v-for loop. I’ve dealt with similar async data + filter issues before, so here’s a breakdown of the likely causes and fixes:

1. Async Data Loading Race Condition

Since you’re fetching productList via Axios, Vue will render the template before the API response comes back. That means on the first render, item.content doesn’t exist yet—so the filter gets passed undefined.

Fix: Guard Against Empty/Unloaded Data

You can add safeguards in your template to only render the content once it’s available:

<main id="app">
  <!-- Only render the list once productList has data -->
  <div v-if="productList.length" v-for="item in productList" :key="item.id">
    <header>
      <h2>{{ item.title }}</h2>
    </header>
    <article class="product-card">
      <!-- Also guard individual item.content -->
      {{ item.content ? (item.content | set_marked) : '' }}
    </article>
  </div>
  <!-- Optional loading state -->
  <div v-else>Loading products...</div>
</main>

Also, make sure you initialize productList as an empty array in your component data to avoid undefined errors during initial render:

data() {
  return {
    productList: [] // Initialize empty array
  }
}

2. Filter Registration or Logic Issues

Double-check how you’ve registered the set_marked filter—Vue 2 and Vue 3 handle this differently, and missing checks for undefined in the filter logic will cause console errors.

For Vue 2:

Ensure the filter is properly registered (globally or locally) and includes a guard for undefined values:

// Global registration (in your main.js)
Vue.filter('set_marked', function(value) {
  // Exit early if value is undefined/null
  if (!value) return '';
  // Your actual markdown parsing logic here (e.g., using marked.js)
  return marked(value);
});

// Or local registration in your component
export default {
  filters: {
    set_marked(value) {
      if (!value) return '';
      return marked(value);
    }
  },
  // ... rest of component code
}

For Vue 3:

Vue 3 removed built-in filter support—use a component method instead, which is more flexible:

export default {
  methods: {
    setMarked(value) {
      if (!value) return '';
      return marked(value);
    }
  },
  // ... rest of component code
}

Then update your template to call the method directly:

<article class="product-card">
  {{ setMarked(item.content) }}
</article>

3. Verify API Response Structure

It’s possible the Axios response doesn’t have the content field you expect. Check if the data from your API matches what you’re trying to access:

axios.get('/your-product-api-endpoint')
  .then(response => {
    console.log('Raw API response:', response.data); // Inspect the data structure
    this.productList = response.data; // Make sure this is an array of items with `content`
  })
  .catch(err => console.error('Failed to fetch products:', err));

Look for typos (e.g., Content instead of content) or cases where content is explicitly null in the API response.


内容的提问来源于stack exchange,提问作者Benoit Henry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:00:41