サンプルデモ
See the Pen Google Trends with Vue by Masaki Oba (@Cleysense) on CodePen.
実装方法
コンポーネントの準備
まずはVueコンポーネントとVueインスタンスを作成します。
// Vueコンポーネント作成 Vue.component('google-trend', { template: '<div :id="id"></div>', props: [ 'id', // 要素のid設定 'keywords', // キーワードは配列 (e.g. keywords="[サッカー,テニス]") 'geo', // 言語、初期値はJPで省略可 'search', // 期間 (e.g. 2004-01-01 2018-10-30) ], }); // Vueインスタンス作成 const app = new Vue({ el: '#app', });
これでVueインスタンス内で<google-trend>タグ(コンポーネント)を使用することができるようになりました。
<div id="app"> <google-trend id="" keywords="" geo="" search=""/> </div>
コンポーネントの呼び出しは下記のように</google-trend>で閉じる形式でも同様に動作しますが、今回はコンポーネントの中に何も記述しないため省略しています。
<div id="app"> <google-trend id="" keywords="" geo="" search=""></google-trend> </div>
createdフック内の処理
createdフックを利用することで、インスタンスが生成された後にコードを実行することができます。
propsオプションの各データを初期化して、検索キーワードを複数指定できるように配列で処理するようにした上で、各データを埋め込みコード用に配列にしておきます。
created: function () { /* 初期化 */ let keywords = this.keywords; keywords = keywords.split(','); const geo = this.geo ? this.geo : 'JP'; const search = this.search; let arr = []; /* 複数キーワード対応 */ for (let i = 0; i < keywords.length; i++) { arr.push({ "keyword": keywords[i], "geo": geo, "time": search }); } }
Googleトレンドの埋め込みに必要なjsファイルを予め読み込みます。
/* embed_loader.jsの読み込み */ const script = document.createElement("script"); script.src = "https://ssl.gstatic.com/trends_nrtr/760_RC08/embed_loader.js"; script.async = true; document.head.appendChild(script);
埋め込み処理コードで再度利用するときのために、keywordsを文字列化して不要な括弧をはずしておきます。
keywords = keywords.join(','); keywords = keywords.match(/\[(.+)\]/)[1];
jsファイルを読み込んだ後でないと、埋め込み処理のコードが実行できないため、読み込んだ後に実行できるようにonloadを利用して、読み込んだ後に埋め込み処理のコードを実行するようにします。
この際、trends.embed.renderExploreWidgetではなく、trends.embed.renderExploreWidgetToを使い、埋め込む位置を指定するようにします。
埋め込みコード用に配列にしたものをcomparisonItemの中で展開することにより、検索キーワードの複数指定が実現できています。
script.onload = () => { var divElem = document.getElementById(this.id); /* 処理実行(renderExploreWidgetToで要素に呼び出す) */ trends.embed.renderExploreWidgetTo(divElem, "TIMESERIES", { "comparisonItem": arr, "category": 0, "property": "" }, { "exploreQuery": "q=" + keywords + "&date=all&geo=" + geo, "guestPath": "https://trends.google.com:443/trends/embed/" }); }
コンポーネントを使ってみる
<div id="app"> <google-trend id="google-trend" keywords="[サッカー,テニス]" geo="JP" search="2012-01-01 2018-10-30"/> </div>