2017-11-23 13 views
0

コンテキスト:私は、ワードプレスapiからのタグ、カテゴリの投稿のリストを持っています。私はVueでこれらの投稿を表示し、力価、説明、タグ、およびカテゴリ計算されたデータが変更されたとき、Vueは更新されません

問題に基づいて結果をフィルタリングするために、検索ボックスでcomputedを使用して:ユーザーが使用可能なタグのリストをクリックしたときに私はcomputedリストを更新しようとしています。

var vm = new Vue({ 
 
    el: '#blogs',  
 
    data: { 
 
     search: '', 
 
     posts: [], 
 
     filterPosts: [] 
 
    }, 
 
    beforeMount: function() { 
 
     // It should call the data and update 
 
     callData(); 
 
    }, 
 
    computed: { 
 
     filterPosts: { 
 
      get: function() { 
 
       var self = this; 
 
       return self.posts.filter(function(post){ 
 
        var query = self.search.toLowerCase(); 
 
        var title = post.title.toLowerCase(); 
 
        var content = post.content.toLowerCase(); 
 
        var date = post.date.toLowerCase(); 
 
        var categories = ''; 
 
        post.categories.forEach(function(category) { 
 
         categories += category.name.toLowerCase(); 
 
        }); 
 
        var tags = ''; 
 
        post.tags.forEach(function(tag){ 
 
         tags += tag.name.toLowerCase(); 
 
        }); 
 
        return title.indexOf(query) !== -1 ||content.indexOf(query) !== -1 || date.indexOf(query) !== -1 || categories.indexOf(query) !== -1 || tags.indexOf(query) !== -1; 
 
       }); 
 
      }, 
 
      set: function (newValue) { 
 
       console.log(newValue); 
 
       this.filterPosts = Object.assign({}, newValue); 
 
      } 
 
     } 
 
    }, 
 
    methods: { 
 
     filterByTag: function(tag, event) { 
 
      event.preventDefault(); 
 
      var self = this; 
 
      self.filterPosts = self.posts.filter(function(post){ 
 
       var tags = ''; 
 
       post.tags.forEach(function(tag){ 
 
        tags += tag.name.toLowerCase(); 
 
       }); 
 
       return tags.indexOf(tag.toLowerCase()) !== -1; 
 
      }); 
 
     } 
 
    } 
 
}); // Vue instance

私はmethodsに書きましたが、Vueが再レンダリングビューではありませんでした機能に基づいてconsole.log常に出力新しいデータ:私はこのようなcomputedデータのgetsetを追加します。私は正しい方法をやっていないと思うか、Vueのように思った。あなたはいくつかの洞察力を与えてくれますか?

編集1 完全コードを追加してください。

私はdatafilterPostsを追加しようとしましたが、私はVueのからこのエラーを受け取っ:

data: { 
    myValue: 'OK' 
    }, 
    computed: { 
    filterPosts: { 
     get: function() { 
     return this.myValue + ' is OK' 
     } 
     set: function (newValue) { 
     this.myValue = newValue 
     } 
    } 
    } 

より:The computed property "filterPosts" is already defined in data.

+1

クリアしないで、すべての...もっとコード – pirs

+0

を共有し、私は今、いくつかの新しいコード –

答えて

0

私は解決策を見つけたので、今Vueで正しい方法かもしれないと思っています。計算されたデータを依存関係のプロパティまたはデータで更新します。私はタグをクリックすると、それはactiveTagを変更して計算filterPost再検査を通知し、再レンダリングされます、dataactiveTagを追加するよう

set方法は、このような場合のために動作しませんでした。 computedのデータを更新する別の方法があるかどうか教えてください。

var vm = new Vue({ 
 
    el: '#blogs',  
 
    data: { 
 
     search: '', 
 
     posts: [], 
 
     tags: [], 
 
     activeTag: '' 
 
    }, 
 
    beforeMount: function() { 
 
     // It should call the data and update 
 
     callData(); 
 
    }, 
 
    computed: { 
 
     filterPosts: { 
 
      get: function() { 
 
       var self = this; 
 
       return self.posts.filter(function(post){ 
 
        var query = self.search.toLowerCase(); 
 
        var title = post.title.toLowerCase(); 
 
        var content = post.content.toLowerCase(); 
 
        var date = post.date.toLowerCase(); 
 
        var categories = ''; 
 
        post.categories.forEach(function(category) { 
 
         categories += category.name.toLowerCase(); 
 
        }); 
 
        var tags = ''; 
 
        post.tags.forEach(function(tag){ 
 
         tags += tag.name.toLowerCase(); 
 
        }); 
 
        var activeTag = self.activeTag; 
 
        if (activeTag !== '') { 
 
         return tags.indexOf(activeTag.toLowerCase()) !== -1; 
 
        }else{ 
 
         return title.indexOf(query) !== -1 ||content.indexOf(query) !== -1 || date.indexOf(query) !== -1 || categories.indexOf(query) !== -1 || tags.indexOf(query) !== -1; 
 
        }      
 
       }); 
 
      }, 
 
      set: function (newValue) { 
 
       console.log(newValue); 
 
      } 
 
     } 
 
    }, 
 
    methods: { 
 
     filterByTag: function(tag, event) { 
 
      event.preventDefault(); 
 
      var self = this; 
 
      self.activeTag = tag; 
 
     } 
 
    } 
 
}); // Vue instance

1

あなたのセッターは実際には何も設定されていません新しい値だけが記録されます。どこかに保管する必要があります。

data: { 
    value: 'foo', 
}, 
computed: { 
    otherValue: { 
    get() { /*...*/ }, 
    set(newVal) { this.value = newVal }, 
    }, 
}, 

をしかし、これはあなたがVuexを使用する場合は、セッターは、計算された値が得ることを確認するアクションを派遣することができ、間違いなく唯一の可能性ではありません。

たとえば、あなたは、コンポーネントのデータでそれを保存することができます更新しました。コンポーネントは最終的に更新をキャッチし、新しい値を表示します。

computed: { 
    value: { 
    get() { 
     return this.$store.getters.externalData; 
    }, 
    set(newVal) { 
     return this.$store.dispatch('modifyingAction', newVal); 
    }, 
    }, 
}, 

最後に、セッターのデータ変更をトリガーする必要があります。そうしないと、コンポーネントが更新されず、再レンダリングがトリガーされません。


EDIT(オリジナルの答えは完全なコードで更新されました):

答えは、あなたが手動postsを変更せずにリストfilteredPostsを変更しない限り、あなたはgetset機能を必要としないということですあなたの計算された変数のために。あなたが望む行動はこれでacheivedすることができます。

const vm = new Vue({ 
    data() { 
    return { 
     search: '', 
     posts: [], 
     // these should probably be props, or you won't be able to edit the list easily. The result is the same anyway. 
    }; 
    }, 
    computed: { 
    filteredPosts() { 
     return this.posts.filter(function(post) { 
     ... // do the filtering 
     }); 
    }, 
    }, 
    template: "<ul><li v-for='post in filteredPosts'>{{ post.content }}</li></ul>", 
}); 

この方法であなたはdatapostsまたはsearch変数を変更した場合、filteredPostsが再計算されます、と再レンダリングトリガされます。

+0

を追加します、私はそれは 'newValue'、で、' methods'機能に値を設定すでにデータ部分に 'filterPosts'を入れずに' posts'だけを表示していますが、最初にデータに空の 'filterPosts'を追加する必要がありますか? –

+0

私は完全なコードを追加しました。次回はvuexを試してみることができますが、今はどのように動作させるか知りたいだけです。 –

+0

'data'に' filterPost'は必要ありません。あなたが望むのは 'posts'変数に新しい投稿を追加することです。 'filterPosts'が再計算され、新しい項目が表示されます。 基本的に、vueは、 '計算されたもの 'を評価するために使用される' data'、 'props'(etc ...)の変数を追跡し、それらが変更されたときに再計算をトリガします。 – corentin592

関連する問題