【问题标题】:How to forceUpdate vue data如何强制更新vue数据
【发布时间】:2020-04-14 09:12:22
【问题描述】:

我在 laravel 中使用 vuejs,当 url 发生变化但新数据不会显示时,我有下一页和上一页的链接。

代码

Controller

$verse = Chapter::where('slug', $slug)->with(['verses', 'book'])->first();
$next = Chapter::where('id', '>', $verse->id)->first();
$previous = Chapter::where('id', '<', $verse->id)->first();
return response()->json([
  'verses' => $verse,
  'next' => $next,
  'previous' => $previous,
]);

component

<div v-if="previous !== null" :v-model="previous" class="bible-nav-button previous">
    <router-link :to="`/${testament_slug}/${book_slug}/${previous.slug}`">
        <i class="fas fa-chevron-left"></i> <span>Previous</span>
    </router-link>
</div>
<div v-if="next !== null" :v-model="next" class="bible-nav-button next">
    <router-link :to="`/${testament_slug}/${book_slug}/${next.slug}`">
        <span>Next</span> <i class="fas fa-chevron-right"></i>
    </router-link>
</div>

<script>
    export default {
        name: "books",
        data() {
            return {
                url: window.location.origin + "" + window.location.pathname,
                title: '',
                testament_slug:'',
                book_slug: '',
                slug: '',
                verses: [],
                next: '',
                previous: ''
            }
        },
        methods: {
            getBooks: function(){
                this.testament_slug = this.$route.params.testament_slug
                this.book_slug = this.$route.params.book_slug
                this.slug = this.$route.params.slug
                axios.get('/api/'+this.$route.params.book_slug+'/'+this.$route.params.slug+'/'+this.$route.params.slug).then((res) => {
                    this.verses = res.data.verses
                    this.title = "Read Bible: " +res.data.verses.book.name+ " " +res.data.verses.name
                    this.next = res.data.next
                    this.previous= res.data.previous
                })
                .catch((err) => {
                    console.log(err)
                });
            },
            myHTML: function(item) {
                return "<strong>"+item.number+"</strong> "+item.body+" ";
            }
        },
        mounted() {
            this.getBooks();
        }
    }
</script>

知道如何获取我的新数据吗?

【问题讨论】:

  • 我的建议是使用 vuex(store)。这样您就可以将数据存储在状态中,然后只需将状态映射到您的任何组件
  • @livresonltc 我从来没有这样做过(因为我是 vue 的新手)你介意分享示例作为答案吗?

标签: laravel vue.js


【解决方案1】:

您可以在&lt;router-view&gt; 标签中使用:key 属性并使用路由全路径。

&lt;router-view :key="$route.fullPath"&gt;&lt;/router-view&gt;

我之前放了一个当前路由的watcher,调用函数来获取数据,但是看了vueschool的vue-router教程后才发现我们可以这样做。

另见question的答案

【讨论】:

  • 我有像&lt;div v-for="item in verses.verses" :key="item.id"&gt; 这样的循环,然后当我使用你的解决方案时,我收到了这个错误Duplicate keys detected: '/url/xyz/'. This may cause an update error.
  • 好的,我发现我的错误(应该添加到router-view)有一个小问题,而我的下一个按钮工作正常,我的上一个按钮只是跳转到除上一页之外的第一页,知道吗?跨度>
  • @mafortis 可能是因为您获取上一页 Chapter::where('id', '&lt;', $verse-&gt;id)-&gt;first(); 的查询使其获取第一个 ID。在调用-&gt;first() 之前添加-&gt;orderBy('id', desc) 应该可以解决您的问题。
  • 是的,对于上一个我们可以使用 orderby,但对于下一个将导致与上一个按钮相同的问题。谢谢大佬,现在已经完全解决了。欣赏它。
【解决方案2】:

您有两个简单的选择:

1) 将“上一个”和“下一个”更改为再次调用 fetch 函数然后更新 URL 的 @click 操作(例如 this.$router.push())。

<span @click="goNext(/* needed arguments here */)">Next</span>

goNext (/* params here */) {
     //set whatever variables you need to
     this.$router.push(/* route as string here */)
     this.getBooks()
}

2) 由于您使用的是路由器,因此每次 URL 更改时都使用警卫进行更新: https://router.vuejs.org/guide/advanced/navigation-guards.html

beforeRouteUpdate(to, from, next) {
     this.getBooks()
     next()
}

【讨论】:

  • 您好,谢谢您的回答,我已经尝试过 2 号,但这里没有任何改变是截图我是怎么做到的 ibb.co/rw5m0yG 你介意给 1 号的样本吗?也许可行
  • 路由守卫不进入“方法”。它是它自己的财产。请仔细阅读我发送给您的文档。我将更新选项 1 的答案。
  • 不幸的是,我无法使用任何一种方式:/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 2019-04-11
  • 2020-05-29
相关资源
最近更新 更多