主頁 > .NET開發 > Nuxt Algolia-谷歌地圖不更新即時搜索的新結果

Nuxt Algolia-谷歌地圖不更新即時搜索的新結果

2022-01-09 02:04:08 .NET開發

我正在使用 nuxt 開發即時搜索。Googlemaps 在頁面加載時收到第一組結果并毫無問題地呈現標記 - 但是在搜索新結果時不會在地圖上更新?有沒有辦法可以將新的結果集推送到地圖以呈現標記?

我認為這將是beforeMount鉤子并將結果傳遞給updateMap?

頁面/index.vue

<template>
  <div class="root">

    <div class="container">

      <ais-instant-search-ssr
        :search-client="searchClient"
        index-name="dive_buddy"
      >
        <ais-configure :hits-per-page.camel="7">
          <ais-search-box placeholder="Search here…" class="searchbox" />
          <ais-stats />

          <div class="h-screen">
            <ais-hits>
              <template #default="{ items }">
                <div class="grid grid-cols-2 gap-2">
                  <div v-if="items.length">
                    <div
                      v-for="item in items"
                      :key="item.objectID"
                      class="my-2 p-2 border"
                    >
                      <SiteRow
                        :site="item"
                        @mouseover.native="highlightMarker(item.objectID, true)"
                        @mouseout.native="highlightMarker(item.objectID, false)"
                      />
                    </div>
                  </div>
                  <div v-else>No results found</div>
                  <Map
                    :items="items"
                    :lat="items[0].lat"
                    :lng="items[0].lng"
                  />
                </div>
              </template>
            </ais-hits>
            <ais-pagination />
          </div>
        </ais-configure>
      </ais-instant-search-ssr>
    </div>
  </div>
</template>

<script>
import {
  AisInstantSearchSsr,
  AisConfigure,
  AisHits,
  AisSearchBox,
  AisStats,
  AisPagination,
  createServerRootMixin,
} from 'vue-instantsearch'
import algoliasearch from 'algoliasearch/lite'
import _renderToString from 'vue-server-renderer/basic'

function renderToString(app) {
  return new Promise((resolve, reject) => {
    _renderToString(app, (err, res) => {
      if (err) reject(err)
      resolve(res)
    })
  })
}

const searchClient = algoliasearch(
  'xxx', // AppID
  'xxxxxxxx' // APIKey
)

export default {
  components: {
    AisInstantSearchSsr,
    AisConfigure,
    AisHits,
    AisSearchBox,
    AisStats,
    AisPagination,
  },
  mixins: [
    createServerRootMixin({
      searchClient,
      indexName: 'dive_buddy',
    }),
  ],
  data() {
    return {
      searchClient,
    }
  },
  head() {
    return {
      link: [
        {
          rel: 'stylesheet',
          href: 'https://cdn.jsdelivr.net/npm/[email protected]/themes/satellite-min.css',
        },
      ],
    }
  },

  serverPrefetch() {
    return this.instantsearch
      .findResultsState({
        component: this,
        renderToString,
      })
      .then((algoliaState) => {
        this.$ssrContext.nuxt.algoliaState = algoliaState
      })
  },

  beforeMount() {
    const results =
      (this.$nuxt.context && this.$nuxt.context.nuxtState.algoliaState) ||
      window.__NUXT__.algoliaState

    this.instantsearch.hydrate(results)

    // Remove the SSR state so it can't be applied again by mistake
    delete this.$nuxt.context.nuxtState.algoliaState
    delete window.__NUXT__.algoliaState
  },

  methods: {
    highlightMarker(id, isHighlighted) {
      document
        .getElementsByClassName(`id-${id}`)[0]
        ?.classList?.toggle('marker-highlight', isHighlighted)
    },
  },
}
</script>

組件/Map.vue

<template>
  <div ref="map" class="h-screen"></div>
</template>

<script>
export default {
  props: {
    items: {
      type: Array,
      required: true,
    },
    lat: {
      type: Number,
      required: true,
    },
    lng: {
      type: Number,
      required: true,
    },
  },

  mounted() {
    this.updateMap()
  },

  methods: {
    // run showMap function in maps.client.js
    async updateMap() {
      await this.$maps.showMap(
        this.$refs.map,
        this.lat,
        this.lng,
        this.getMarkers()
      )
    },

    // pass through markers to googlemaps
    getMarkers() {
      return this.items.map((item) => {
        return {
          ...item,
        }
      })
    },
  },
}
</script>

插件/maps.client.js

export default function(context, inject){
    let isLoaded = false
    let waiting = []
    
    addScript()
    inject('maps', {
        showMap,
    })


    function addScript(){
        const script = document.createElement('script')
        script.src = "https://maps.googleapis.com/maps/api/js?key=xxxx&libraries=places&callback=initGoogleMaps"
        script.async = true
        window.initGoogleMaps = initGoogleMaps
        document.head.appendChild(script)
    }

    function initGoogleMaps(){
        isLoaded =  true
        waiting.forEach((item) => {
            if(typeof item.fn === 'function'){
                item.fn(...item.arguments)
            }
        })
        waiting = []
    }

    function showMap(canvas, lat, lng, markers){
        if(!isLoaded){
            waiting.push({
                fn: showMap,
                arguments,
            })
            return
        }
        const mapOptions = {
            zoom: 18,
            center: new window.google.maps.LatLng(lat, lng),
            disableDefaultUI: true,
            zoomControl: true,
            styles:[{
                featureType: 'poi.business',
                elementType: 'labels.icon',
                stylers:[{ visibility: 'off' }]
            }]
        }
        const map = new window.google.maps.Map(canvas, mapOptions)
        if(!markers){
            const position = new window.google.maps.LatLng(lat, lng)
            const marker = new window.google.maps.Marker({ 
                position,
                clickable: false,
            })
            marker.setMap(map)
            return
        }

        const bounds = new window.google.maps.LatLngBounds()
        let index = 1
        markers.forEach((item) => {
            const position = new window.google.maps.LatLng(item.lat, item.lng)
            const marker = new window.google.maps.Marker({ 
                position, 
                label: {
                    text: `${index}`,
                    color: 'black',
                    className: `marker id-${item.objectID}`
                },
                icon: 'https://maps.gstatic.com/mapfiles/transparent.png',
                clickable: false,
            })
            marker.setMap(map)
            bounds.extend(position)
            index  
        })

        map.fitBounds(bounds)
        
    }
}

Nuxt   Algolia - 谷歌地圖不更新即時搜索的新結果

編輯 根據@Bryan 的建議 - 我之前曾嘗試使用vue-googlemaps插件遵循 algolia 的檔案,但這在 Nuxt 上不起作用,因為地圖無法加載以及這些錯誤 -
Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'g')
Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'h')

uj5u.com熱心網友回復:

雖然這不是上述問題的解決方案 - 我找到了使用不同庫的解決方法:vue2-google-maps因為這適用于 Nuxt(請參閱檔案)。

頁面/index.vue

<template>
  <div class="root">

    <div class="container">
      <ais-instant-search-ssr
        :search-client="searchClient"
        index-name="dive_centres"
      >
        <ais-configure :hits-per-page.camel="7">
          <ais-search-box placeholder="Search here…" class="searchbox" />
          <ais-stats />

          <div class="h-screen">
            <ais-hits>
              <template #default="{ items }">
                <div class="grid grid-cols-2 gap-2">
                  <div v-if="items.length">
                    <div
                      v-for="item in items"
                      :key="item.objectID"
                      class="my-2 p-2 border"
                    >
                      <SiteRow
                        :site="item"
                        @mouseover.native="highlightMarker(item.objectID, true)"
                        @mouseout.native="highlightMarker(item.objectID, false)"
                      />
                    </div>
                  </div>
                  <div v-else>No results found</div>
                  <Map />
                </div>
              </template>
            </ais-hits>
            <ais-pagination />
          </div>
        </ais-configure>
      </ais-instant-search-ssr>
    </div>
  </div>
</template>

<script>
import {
  AisInstantSearchSsr,
  AisConfigure,
  AisHits,
  AisSearchBox,
  AisStats,
  AisPagination,
  createServerRootMixin,
} from 'vue-instantsearch'
import algoliasearch from 'algoliasearch/lite'
import _renderToString from 'vue-server-renderer/basic'

function renderToString(app) {
  return new Promise((resolve, reject) => {
    _renderToString(app, (err, res) => {
      if (err) reject(err)
      resolve(res)
    })
  })
}

const searchClient = algoliasearch(
  'xxx',     // AppID
  'xxxxxxxx' // APIKey
)

export default {
  components: {
    AisInstantSearchSsr,
    AisConfigure,
    AisHits,
    AisSearchBox,
    AisStats,
    AisPagination,
  },
  mixins: [
    createServerRootMixin({
      searchClient,
      indexName: 'dive_sites',
    }),
  ],

  head() {
    return {
      link: [
        {
          rel: 'stylesheet',
          href: 'https://cdn.jsdelivr.net/npm/[email protected]/themes/satellite-min.css',
        },
      ],
    }
  },

  serverPrefetch() {
    return this.instantsearch
      .findResultsState({
        component: this,
        renderToString,
      })
      .then((algoliaState) => {
        this.$ssrContext.nuxt.algoliaState = algoliaState
      })
  },

  beforeMount() {
    const results =
      (this.$nuxt.context && this.$nuxt.context.nuxtState.algoliaState) ||
      window.__NUXT__.algoliaState

    this.instantsearch.hydrate(results)

    // Remove the SSR state so it can't be applied again by mistake
    delete this.$nuxt.context.nuxtState.algoliaState
    delete window.__NUXT__.algoliaState
  },

  methods: {
    highlightMarker(id, isHighlighted) {
      console.log(id)
      document
        .getElementsByClassName(`id-${id}`)[0]
        ?.classList?.toggle('marker-highlight', isHighlighted)
    },
  },
}
</script>

組件/Map.vue

<template>
  <div v-if="state" class="ais-GeoSearch">
    
    <GmapMap
      :center="center"
      :zoom="zoom"
      map-type-id="terrain"
      class="h-full w-full"
      :options="options"
    >
      <GmapMarker
        v-for="item in state.items"
        :key="item.objectID"
        :position="item._geoloc"
        :clickable="false"
        :draggable="true"
        :icon="{ url: require('~/static/images/dive-site-small.svg') }"
      />
    </GmapMap>
  </div>
</template>

<script>
import { createWidgetMixin } from 'vue-instantsearch'
import { connectGeoSearch } from 'instantsearch.js/es/connectors'

export default {
  mixins: [createWidgetMixin({ connector: connectGeoSearch })],

  data() {
    return {
      zoom: 4,
      options: {
        disableDefaultUI: true,
      },
    }
  },
  computed: {
    center() {
      return this.state.items.length !== 0
        ? this.state.items[0]._geoloc
        : { lat: 48.864716, lng: 2.349014 }
    },
  },
}
</script>

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/405803.html

標籤:

上一篇:如何在谷歌地圖上將大洋洲更改為澳大利亞?

下一篇:位置預測和.getPlace()使用谷歌地圖加載器進行地點自動完成在Vue中不起作用

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more