最近公司爱尔兰项目需要使用google地图,项目还是用vue写的,那我就寻思找个vue能用的google地图的插件吧,找了vue2-google-maps,这个插件确实还行,而且github上还有api文档,虽然都是英文很难受,但是还行,没有骚需求的话,用它还行。
google地图里面有个功能,label,vue2-google-maps里面是没有办法控制label的位置的,默认就是显示在中间,但是如果写自定义覆盖层又觉得麻烦,于是还是用了原生得Google JavaScriptApi,并且引用了一个js库,markerwithlabel.js,引入了这个库就可以对label进行操作,库的代码不是很多,附在最后。
Map JavaScriptApi:
https://developers.google.cn/maps/documentation/javascript/tutorial
那么,使用google需要几步,
1、申请秘钥,这个秘钥说起来就很恶心了,我自己申请过了,但是只是好用了一下,刷新了就报错了,好像是说秘钥过期,很醉,于是找安卓小哥要了秘钥,据说客户付过费了还是咋的,具体我也不清楚google的秘钥规则,要给api权限好像,很麻烦。
2、引入google的地图库,即便你用的是vue也可以直接在index.html中使用,下面是引入的操作label的文件
<!--GGMap-->
<script type="text/javascript" src="http://maps.google.com/maps/api/js?key=***你的秘钥***"></script>
<script type="text/javascript" src="./static/markerwithlabel.js"></script>
3、创建map的实例,还是原生的用着舒服。有一个很重要,初始化地图,不要在created钩子中调用方法,否则会google is
not defend,很难受,我也找了很久的原因,原因是不能再初始化实例的时候去创建地图,需要等待dom渲染完,在mounted钩子中调用就好了。
<template>
<div id="map_canvas" style="height: 700px; width: 100%"></div>
</template>
<script>
export default {
name: 'GGMap',
data(){
return{
show:false,
center: {lng: 120.5, lat: 30.2},
markers: [{
position: {lng: 120.4, lat: 30.2},
orderId:'123456',
name:'吴韩伟',
show:false,
position: {lng: 120.5, lat: 30.2},
orderId:'654321',
name:'姚永琪',
show:false,
icon: '../../../static/img/qishou.png',
position:{},
websock:null,
created(){
//页面刚进入时开启长连接
// this.initWebSocket()
destroyed: function() {
//页面销毁时关闭长连接
this.websocketclose();
mounted(){
this.mapBuild() //初始化实例之后调用
methods:{
// 地图实例
mapBuild(){
//创建地图实例,zoom是缩放比例
let map = new google.maps.Map(document.getElementById('map_canvas'), {
zoom: 12,
center: this.center,
mapTypeId: google.maps.MapTypeId.ROADMAP
//这里因为需要很多标记,所以遍历了this.markers(后端给的数据)来循环创建标记
this.markers.map(item=>{
let marker = new MarkerWithLabel({
position: item.position,
icon: '../../../static/img/qishou.png', //标记自定义图标
draggable: false, //不可拖动
map: map, //地图实例
labelContent: item.name, //label的内容
labelAnchor: new google.maps.Point(22, 0), //label的位置,可以调
labelClass: "labels", // the CSS class for the label
labelStyle: { background:'#fff',padding:'5px' }
//自定义信息窗口
let iw = new google.maps.InfoWindow({
content: `<div>
<p>订单编号: ${item.orderId}</p>
<p>快递员:${item.name}</p>
</div>`});
//点击信息窗口显示
google.maps.event.addListener(marker, "click", function (e) { iw.open(map, marker); });
</script>
markerwithlabel.js
* @name MarkerWithLabel for V3
* @version 1.1.10 [April 8, 2014]
* @author Gary Little (inspired by code from Marc Ridey of Google).
* @fileoverview MarkerWithLabel extends the Google Maps JavaScript API V3
* <code>google.maps.Marker</code> class.
* MarkerWithLabel allows you to define markers with associated labels. As you would expect,
* if the marker is draggable, so too will be the label. In addition, a marker with a label
* responds to all mouse events in the same manner as a regular marker. It also fires mouse
* events and "property changed" events just as a regular marker would. Version 1.1 adds
* support for the raiseOnDrag feature introduced in API V3.3.
* If you drag a marker by its label, you can cancel the drag and return the marker to its
* original position by pressing the <code>Esc</code> key. This doesn't work if you drag the marker
* itself because this feature is not (yet) supported in the <code>google.maps.Marker</code> class.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
/*jslint browser:true */
/*global document,google */
* @param {Function} childCtor Child class.
* @param {Function} parentCtor Parent class.
* @private
function inherits(childCtor, parentCtor) {
/* @constructor */
function tempCtor() {}
tempCtor.prototype = parentCtor.prototype;
childCtor.superClass_ = parentCtor.prototype;
childCtor.prototype = new tempCtor();
/* @override */
childCtor.prototype.constructor = childCtor;
* This constructor creates a label and associates it with a marker.
* It is for the private use of the MarkerWithLabel class.
* @constructor
* @param {Marker} marker The marker with which the label is to be associated.
* @param {string} crossURL The URL of the cross image =.
* @param {string} handCursor The URL of the hand cursor.
* @private
function MarkerLabel_(marker, crossURL, handCursorURL) {
this.marker_ = marker;
this.handCursorURL_ = marker.handCursorURL;
this.labelDiv_ = document.createElement("div");
this.labelDiv_.style.cssText = "position: absolute; overflow: hidden;";
// Set up the DIV for handling mouse events in the label. This DIV forms a transparent veil
// in the "overlayMouseTarget" pane, a veil that covers just the label. This is done so that
// events can be captured even if the label is in the shadow of a google.maps.InfoWindow.
// Code is included here to ensure the veil is always exactly the same size as the label.
this.eventDiv_ = document.createElement("div");
this.eventDiv_.style.cssText = this.labelDiv_.style.cssText;
// This is needed for proper behavior on MSIE:
this.eventDiv_.setAttribute("onselectstart", "return false;");
this.eventDiv_.setAttribute("ondragstart", "return false;");
// Get the DIV for the "X" to be displayed when the marker is raised.
this.crossDiv_ = MarkerLabel_.getSharedCross(crossURL);
inherits(MarkerLabel_, google.maps.OverlayView);
* Returns the DIV for the cross used when dragging a marker when the
* raiseOnDrag parameter set to true. One cross is shared with all markers.
* @param {string} crossURL The URL of the cross image =.
* @private
MarkerLabel_.getSharedCross = function (crossURL) {
var div;
if (typeof MarkerLabel_.getSharedCross.crossDiv === "undefined") {
div = document.createElement("img");
div.style.cssText = "position: absolute; z-index: 1000002; display: none;";
// Hopefully Google never changes the standard "X" attributes:
div.style.marginLeft = "-8px";
div.style.marginTop = "-9px";
div.src = crossURL;
MarkerLabel_.getSharedCross.crossDiv = div;
return MarkerLabel_.getSharedCross.crossDiv;
* Adds the DIV representing the label to the DOM. This method is called
* automatically when the marker's <code>setMap</code> method is called.
* @private
MarkerLabel_.prototype.onAdd = function () {
var me = this;
var cMouseIsDown = false;
var cDraggingLabel = false;
var cSavedZIndex;
var cLatOffset, cLngOffset;
var cIgnoreClick;
var cRaiseEnabled;
var cStartPosition;
var cStartCenter;
// Constants:
var cRaiseOffset = 20;
var cDraggingCursor = "url(" + this.handCursorURL_ + ")";
// Stops all processing of an event.
var cAbortEvent = function (e) {
if (e.preventDefault) {
e.preventDefault();
e.cancelBubble = true;
if (e.stopPropagation) {
e.stopPropagation();
var cStopBounce = function () {
me.marker_.setAnimation(null);
this.getPanes().overlayImage.appendChild(this.labelDiv_);
this.getPanes().overlayMouseTarget.appendChild(this.eventDiv_);
// One cross is shared with all markers, so only add it once:
if (typeof MarkerLabel_.getSharedCross.processed === "undefined") {
this.getPanes().overlayImage.appendChild(this.crossDiv_);
MarkerLabel_.getSharedCross.processed = true;
this.listeners_ = [
google.maps.event.addDomListener(this.eventDiv_, "mouseover", function (e) {
if (me.marker_.getDraggable() || me.marker_.getClickable()) {
this.style.cursor = "pointer";
google.maps.event.trigger(me.marker_, "mouseover", e);
google.maps.event.addDomListener(this.eventDiv_, "mouseout", function (e) {
if ((me.marker_.getDraggable() || me.marker_.getClickable()) && !cDraggingLabel) {
this.style.cursor = me.marker_.getCursor();
google.maps.event.trigger(me.marker_, "mouseout", e);
google.maps.event.addDomListener(this.eventDiv_, "mousedown", function (e) {
cDraggingLabel = false;
if (me.marker_.getDraggable()) {
cMouseIsDown = true;
this.style.cursor = cDraggingCursor;
if (me.marker_.getDraggable() || me.marker_.getClickable()) {
google.maps.event.trigger(me.marker_, "mousedown", e);
cAbortEvent(e); // Prevent map pan when starting a drag on a label
google.maps.event.addDomListener(document, "mouseup", function (mEvent) {
var position;
if (cMouseIsDown) {
cMouseIsDown = false;
me.eventDiv_.style.cursor = "pointer";
google.maps.event.trigger(me.marker_, "mouseup", mEvent);
if (cDraggingLabel) {
if (cRaiseEnabled) { // Lower the marker & label
position = me.getProjection().fromLatLngToDivPixel(me.marker_.getPosition());
position.y += cRaiseOffset;
me.marker_.setPosition(me.getProjection().fromDivPixelToLatLng(position));
// This is not the same bouncing style as when the marker portion is dragged,
// but it will have to do:
try { // Will fail if running Google Maps API earlier than V3.3
me.marker_.setAnimation(google.maps.Animation.BOUNCE);
setTimeout(cStopBounce, 1406);
} catch (e) {}
me.crossDiv_.style.display = "none";
me.marker_.setZIndex(cSavedZIndex);
cIgnoreClick = true; // Set flag to ignore the click event reported after a label drag
cDraggingLabel = false;
mEvent.latLng = me.marker_.getPosition();
google.maps.event.trigger(me.marker_, "dragend", mEvent);
google.maps.event.addListener(me.marker_.getMap(), "mousemove", function (mEvent) {
var position;
if (cMouseIsDown) {
if (cDraggingLabel) {
// Change the reported location from the mouse position to the marker position:
mEvent.latLng = new google.maps.LatLng(mEvent.latLng.lat() - cLatOffset, mEvent.latLng.lng() - cLngOffset);
position = me.getProjection().fromLatLngToDivPixel(mEvent.latLng);
if (cRaiseEnabled) {
me.crossDiv_.style.left = position.x + "px";
me.crossDiv_.style.top = position.y + "px";
me.crossDiv_.style.display = "";
position.y -= cRaiseOffset;
me.marker_.setPosition(me.getProjection().fromDivPixelToLatLng(position));
if (cRaiseEnabled) { // Don't raise the veil; this hack needed to make MSIE act properly
me.eventDiv_.style.top = (position.y + cRaiseOffset) + "px";
google.maps.event.trigger(me.marker_, "drag", mEvent);
} else {
// Calculate offsets from the click point to the marker position:
cLatOffset = mEvent.latLng.lat() - me.marker_.getPosition().lat();
cLngOffset = mEvent.latLng.lng() - me.marker_.getPosition().lng();
cSavedZIndex = me.marker_.getZIndex();
cStartPosition = me.marker_.getPosition();
cStartCenter = me.marker_.getMap().getCenter();
cRaiseEnabled = me.marker_.get("raiseOnDrag");
cDraggingLabel = true;
me.marker_.setZIndex(1000000); // Moves the marker & label to the foreground during a drag
mEvent.latLng = me.marker_.getPosition();
google.maps.event.trigger(me.marker_, "dragstart", mEvent);
google.maps.event.addDomListener(document, "keydown", function (e) {
if (cDraggingLabel) {
if (e.keyCode === 27) { // Esc key
cRaiseEnabled = false;
me.marker_.setPosition(cStartPosition);
me.marker_.getMap().setCenter(cStartCenter);
google.maps.event.trigger(document, "mouseup", e);
google.maps.event.addDomListener(this.eventDiv_, "click", function (e) {
if (me.marker_.getDraggable() || me.marker_.getClickable()) {
if (cIgnoreClick) { // Ignore the click reported when a label drag ends
cIgnoreClick = false;
} else {
google.maps.event.trigger(me.marker_, "click", e);
cAbortEvent(e); // Prevent click from being passed on to map
google.maps.event.addDomListener(this.eventDiv_, "dblclick", function (e) {
if (me.marker_.getDraggable() || me.marker_.getClickable()) {
google.maps.event.trigger(me.marker_, "dblclick", e);
cAbortEvent(e); // Prevent map zoom when double-clicking on a label
google.maps.event.addListener(this.marker_, "dragstart", function (mEvent) {
if (!cDraggingLabel) {
cRaiseEnabled = this.get("raiseOnDrag");
google.maps.event.addListener(this.marker_, "drag", function (mEvent) {
if (!cDraggingLabel) {
if (cRaiseEnabled) {
me.setPosition(cRaiseOffset);
// During a drag, the marker's z-index is temporarily set to 1000000 to
// ensure it appears above all other markers. Also set the label's z-index
// to 1000000 (plus or minus 1 depending on whether the label is supposed
// to be above or below the marker).
me.labelDiv_.style.zIndex = 1000000 + (this.get("labelInBackground") ? -1 : +1);
google.maps.event.addListener(this.marker_, "dragend", function (mEvent) {
if (!cDraggingLabel) {
if (cRaiseEnabled) {
me.setPosition(0); // Also restores z-index of label
google.maps.event.addListener(this.marker_, "position_changed", function () {
me.setPosition();
google.maps.event.addListener(this.marker_, "zindex_changed", function () {
me.setZIndex();
google.maps.event.addListener(this.marker_, "visible_changed", function () {
me.setVisible();
google.maps.event.addListener(this.marker_, "labelvisible_changed", function () {
me.setVisible();
google.maps.event.addListener(this.marker_, "title_changed", function () {
me.setTitle();
google.maps.event.addListener(this.marker_, "labelcontent_changed", function () {
me.setContent();
google.maps.event.addListener(this.marker_, "labelanchor_changed", function () {
me.setAnchor();
google.maps.event.addListener(this.marker_, "labelclass_changed", function () {
me.setStyles();
google.maps.event.addListener(this.marker_, "labelstyle_changed", function () {
me.setStyles();
* Removes the DIV for the label from the DOM. It also removes all event handlers.
* This method is called automatically when the marker's <code>setMap(null)</code>
* method is called.
* @private
MarkerLabel_.prototype.onRemove = function () {
var i;
this.labelDiv_.parentNode.removeChild(this.labelDiv_);
this.eventDiv_.parentNode.removeChild(this.eventDiv_);
// Remove event listeners:
for (i = 0; i < this.listeners_.length; i++) {
google.maps.event.removeListener(this.listeners_[i]);
* Draws the label on the map.
* @private
MarkerLabel_.prototype.draw = function () {
this.setContent();
this.setTitle();
this.setStyles();
* Sets the content of the label.
* The content can be plain text or an HTML DOM node.
* @private
MarkerLabel_.prototype.setContent = function () {
var content = this.marker_.get("labelContent");
if (typeof content.nodeType === "undefined") {
this.labelDiv_.innerHTML = content;
this.eventDiv_.innerHTML = this.labelDiv_.innerHTML;
} else {
this.labelDiv_.innerHTML = ""; // Remove current content
this.labelDiv_.appendChild(content);
content = content.cloneNode(true);
this.eventDiv_.innerHTML = ""; // Remove current content
this.eventDiv_.appendChild(content);
* Sets the content of the tool tip for the label. It is
* always set to be the same as for the marker itself.
* @private
MarkerLabel_.prototype.setTitle = function () {
this.eventDiv_.title = this.marker_.getTitle() || "";
* Sets the style of the label by setting the style sheet and applying
* other specific styles requested.
* @private
MarkerLabel_.prototype.setStyles = function () {
var i, labelStyle;
// Apply style values from the style sheet defined in the labelClass parameter:
this.labelDiv_.className = this.marker_.get("labelClass");
this.eventDiv_.className = this.labelDiv_.className;
// Clear existing inline style values:
this.labelDiv_.style.cssText = "";
this.eventDiv_.style.cssText = "";
// Apply style values defined in the labelStyle parameter:
labelStyle = this.marker_.get("labelStyle");
for (i in labelStyle) {
if (labelStyle.hasOwnProperty(i)) {
this.labelDiv_.style[i] = labelStyle[i];
this.eventDiv_.style[i] = labelStyle[i];
this.setMandatoryStyles();
* Sets the mandatory styles to the DIV representing the label as well as to the
* associated event DIV. This includes setting the DIV position, z-index, and visibility.
* @private
MarkerLabel_.prototype.setMandatoryStyles = function () {
this.labelDiv_.style.position = "absolute";
this.labelDiv_.style.overflow = "hidden";
// Make sure the opacity setting causes the desired effect on MSIE:
if (typeof this.labelDiv_.style.opacity !== "undefined" && this.labelDiv_.style.opacity !== "") {
this.labelDiv_.style.MsFilter = "\"progid:DXImageTransform.Microsoft.Alpha(opacity=" + (this.labelDiv_.style.opacity * 100) + ")\"";
this.labelDiv_.style.filter = "alpha(opacity=" + (this.labelDiv_.style.opacity * 100) + ")";
this.eventDiv_.style.position = this.labelDiv_.style.position;
this.eventDiv_.style.overflow = this.labelDiv_.style.overflow;
this.eventDiv_.style.opacity = 0.01; // Don't use 0; DIV won't be clickable on MSIE
this.eventDiv_.style.MsFilter = "\"progid:DXImageTransform.Microsoft.Alpha(opacity=1)\"";
this.eventDiv_.style.filter = "alpha(opacity=1)"; // For MSIE
this.setAnchor();
this.setPosition(); // This also updates z-index, if necessary.
this.setVisible();
* Sets the anchor point of the label.
* @private
MarkerLabel_.prototype.setAnchor = function () {
var anchor = this.marker_.get("labelAnchor");
this.labelDiv_.style.marginLeft = -anchor.x + "px";
this.labelDiv_.style.marginTop = -anchor.y + "px";
this.eventDiv_.style.marginLeft = -anchor.x + "px";
this.eventDiv_.style.marginTop = -anchor.y + "px";
* Sets the position of the label. The z-index is also updated, if necessary.
* @private
MarkerLabel_.prototype.setPosition = function (yOffset) {
var position = this.getProjection().fromLatLngToDivPixel(this.marker_.getPosition());
if (typeof yOffset === "undefined") {
yOffset = 0;
this.labelDiv_.style.left = Math.round(position.x) + "px";
this.labelDiv_.style.top = Math.round(position.y - yOffset) + "px";
this.eventDiv_.style.left = this.labelDiv_.style.left;
this.eventDiv_.style.top = this.labelDiv_.style.top;
this.setZIndex();
* Sets the z-index of the label. If the marker's z-index property has not been defined, the z-index
* of the label is set to the vertical coordinate of the label. This is in keeping with the default
* stacking order for Google Maps: markers to the south are in front of markers to the north.
* @private
MarkerLabel_.prototype.setZIndex = function () {
var zAdjust = (this.marker_.get("labelInBackground") ? -1 : +1);
if (typeof this.marker_.getZIndex() === "undefined") {
this.labelDiv_.style.zIndex = parseInt(this.labelDiv_.style.top, 10) + zAdjust;
this.eventDiv_.style.zIndex = this.labelDiv_.style.zIndex;
} else {
this.labelDiv_.style.zIndex = this.marker_.getZIndex() + zAdjust;
this.eventDiv_.style.zIndex = this.labelDiv_.style.zIndex;
* Sets the visibility of the label. The label is visible only if the marker itself is
* visible (i.e., its visible property is true) and the labelVisible property is true.
* @private
MarkerLabel_.prototype.setVisible = function () {
if (this.marker_.get("labelVisible")) {
this.labelDiv_.style.display = this.marker_.getVisible() ? "block" : "none";
} else {
this.labelDiv_.style.display = "none";
this.eventDiv_.style.display = this.labelDiv_.style.display;
* @name MarkerWithLabelOptions
* @class This class represents the optional parameter passed to the {@link MarkerWithLabel} constructor.
* The properties available are the same as for <code>google.maps.Marker</code> with the addition
* of the properties listed below. To change any of these additional properties after the labeled
* marker has been created, call <code>google.maps.Marker.set(propertyName, propertyValue)</code>.
* When any of these properties changes, a property changed event is fired. The names of these
* events are derived from the name of the property and are of the form <code>propertyname_changed</code>.
* For example, if the content of the label changes, a <code>labelcontent_changed</code> event
* is fired.
* @property {string|Node} [labelContent] The content of the label (plain text or an HTML DOM node).
* @property {Point} [labelAnchor] By default, a label is drawn with its anchor point at (0,0) so
* that its top left corner is positioned at the anchor point of the associated marker. Use this
* property to change the anchor point of the label. For example, to center a 50px-wide label
* beneath a marker, specify a <code>labelAnchor</code> of <code>google.maps.Point(25, 0)</code>.
* (Note: x-values increase to the right and y-values increase to the top.)
* @property {string} [labelClass] The name of the CSS class defining the styles for the label.
* Note that style values for <code>position</code>, <code>overflow</code>, <code>top</code>,
* <code>left</code>, <code>zIndex</code>, <code>display</code>, <code>marginLeft</code>, and
* <code>marginTop</code> are ignored; these styles are for internal use only.
* @property {Object} [labelStyle] An object literal whose properties define specific CSS
* style values to be applied to the label. Style values defined here override those that may
* be defined in the <code>labelClass</code> style sheet. If this property is changed after the
* label has been created, all previously set styles (except those defined in the style sheet)
* are removed from the label before the new style values are applied.
* Note that style values for <code>position</code>, <code>overflow</code>, <code>top</code>,
* <code>left</code>, <code>zIndex</code>, <code>display</code>, <code>marginLeft</code>, and
* <code>marginTop</code> are ignored; these styles are for internal use only.
* @property {boolean} [labelInBackground] A flag indicating whether a label that overlaps its
* associated marker should appear in the background (i.e., in a plane below the marker).
* The default is <code>false</code>, which causes the label to appear in the foreground.
* @property {boolean} [labelVisible] A flag indicating whether the label is to be visible.
* The default is <code>true</code>. Note that even if <code>labelVisible</code> is
* <code>true</code>, the label will <i>not</i> be visible unless the associated marker is also
* visible (i.e., unless the marker's <code>visible</code> property is <code>true</code>).
* @property {boolean} [raiseOnDrag] A flag indicating whether the label and marker are to be
* raised when the marker is dragged. The default is <code>true</code>. If a draggable marker is
* being created and a version of Google Maps API earlier than V3.3 is being used, this property
* must be set to <code>false</code>.
* @property {boolean} [optimized] A flag indicating whether rendering is to be optimized for the
* marker. <b>Important: The optimized rendering technique is not supported by MarkerWithLabel,
* so the value of this parameter is always forced to <code>false</code>.
* @property {string} [crossImage="http://maps.gstatic.com/intl/en_us/mapfiles/drag_cross_67_16.png"]
* The URL of the cross image to be displayed while dragging a marker.
* @property {string} [handCursor="http://maps.gstatic.com/intl/en_us/mapfiles/closedhand_8_8.cur"]
* The URL of the cursor to be displayed while dragging a marker.
* Creates a MarkerWithLabel with the options specified in {@link MarkerWithLabelOptions}.
* @constructor
* @param {MarkerWithLabelOptions} [opt_options] The optional parameters.
function MarkerWithLabel(opt_options) {
opt_options = opt_options || {};
opt_options.labelContent = opt_options.labelContent || "";
opt_options.labelAnchor = opt_options.labelAnchor || new google.maps.Point(0, 0);
opt_options.labelClass = opt_options.labelClass || "markerLabels";
opt_options.labelStyle = opt_options.labelStyle || {};
opt_options.labelInBackground = opt_options.labelInBackground || false;
if (typeof opt_options.labelVisible === "undefined") {
opt_options.labelVisible = true;
if (typeof opt_options.raiseOnDrag === "undefined") {
opt_options.raiseOnDrag = true;
if (typeof opt_options.clickable === "undefined") {
opt_options.clickable = true;
if (typeof opt_options.draggable === "undefined") {
opt_options.draggable = false;
if (typeof opt_options.optimized === "undefined") {
opt_options.optimized = false;
opt_options.crossImage = opt_options.crossImage || "http" + (document.location.protocol === "https:" ? "s" : "") + "://maps.gstatic.com/intl/en_us/mapfiles/drag_cross_67_16.png";
opt_options.handCursor = opt_options.handCursor || "http" + (document.location.protocol === "https:" ? "s" : "") + "://maps.gstatic.com/intl/en_us/mapfiles/closedhand_8_8.cur";
opt_options.optimized = false; // Optimized rendering is not supported
this.label = new MarkerLabel_(this, opt_options.crossImage, opt_options.handCursor); // Bind the label to the marker
// Call the parent constructor. It calls Marker.setValues to initialize, so all
// the new parameters are conveniently saved and can be accessed with get/set.
// Marker.set triggers a property changed event (called "propertyname_changed")
// that the marker label listens for in order to react to state changes.
google.maps.Marker.apply(this, arguments);
inherits(MarkerWithLabel, google.maps.Marker);
* Overrides the standard Marker setMap function.
* @param {Map} theMap The map to which the marker is to be added.
* @private
MarkerWithLabel.prototype.setMap = function (theMap) {
// Call the inherited function...
google.maps.Marker.prototype.setMap.apply(this, arguments);
// ... then deal with the label:
this.label.setMap(theMap);
最近公司爱尔兰项目需要使用google地图,项目还是用vue写的,那我就寻思找个vue能用的google地图的插件吧,找了vue2-google-maps,这个插件确实还行,而且github上还有api文档,虽然都是英文很难受,但是还行,没有骚需求的话,用它还行。 google地图里面有个功能,label,vue2-google-maps里面是没有办法控制label的位置的,默...
水波紋的实现
这个需求的实现肯定是离不开我们自己写
自定义
覆盖物的,那么首先我们来讨论一下水波纹动画的实现。
首先我们可以看到图
中
的覆盖物是由一个红心和水波紋组成,其
中
红心是固定不动的,那么我们可以直接这么写:
<div class=radar></div>
.radar {
width: 40px;
本系列“
vue
项目
中
使用
bpmn-xxxx”分为七篇,均为自己
使用
过程
中
用到的实例,手工原创,目前陆续更新
中
。主要包括
vue
项目
中
bpmn
使用
实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。如果转载或通过爬虫直接爬的,格式特别丑,请来原创看:我是作者原文
经过前四篇的学习,我们能够实现bpmn基本绘图、预览、为节点加事件加颜色等效果,这一篇我们来说,如何
自定义
左侧工具栏(platter),首先看一下
自定义
前后效果图对比:
我们本次要实现的目标:基于左侧platter原有元素类型,创建出一个新的
自定义
节点。暂且叫它“草莓蛋糕”节点,
注:此时的–save是把
vue
-
google
-
maps
写入package.json)
npm install --save
vue
2-
google
-
maps
@0.10.7
安装完成之后,查看package.json是否有
vue
-
google
-
maps
"
vue
2-
google
-
maps
": "^0.10.7",
3. 在main.js文件
中
引入
import * a
目前在
vue
中
使用
google
map
有以下两种方法:
一、
使用
JavaScript 创建
地图
实例
该方法优点在于可配置项多,方便
自定义
,缺点是较复杂,且文档为英文,有一定学习难度。
在开始之前确保你已经在https://console.cloud.
google
.com/
google
/
maps
-apis/overview(谷歌
地图
API官网)创建账户、开通并启用以下API,最后获取到你的
Google
Map
JavaScript API Key,并且有科学
百度
地图
import b
map
JSON from '../../../assets/js/custom_
map
_config.json'
import Micon from '../../../assets/icon/marker2.png'
import MiconHover from '../../../assets/icon/markerHover.png'
import MiconActive from '../../../assets/icon/markerActive.png'
let th
整体思路:首先定义一个infowindow,然后每次对其赋值即可,不必再定义新的infowindow。
//全局的infowindow
var infowindow = new
google
.
maps
.InfoWindow();
//每次调用传递不同的marker(坐标),Message(
信息
)
function attachMessage(marker, Message) {
vue
组件
自定义
标签
Vue
2 JS
Google
Map
的
自定义
标记组件 (Custom marker component for
vue
2 js
google
map
)
This component let user display custom html content on the
map
using Overlay. This component is an adaptation o...
vue
2-g
map
-custom-marker
该组件使您可以
使用
叠加层在
地图
上显示
自定义
HTML内容。 该组件是与一些伟大的想法在谷歌
地图
V3覆盖代码示例改编从这个。
/!\ 重要的提示
该项目最初是的插件。 现在,该项目似乎不再受维护,并且已开始维护已维护的。由于这是一个派生,因此该插件应该看起来像在工作。 该项目的演示于2020-11-10开始
使用
此项目。 阅读以获取更多有关此的
信息
。
对于
使用
vue
-
google
-
maps
的旧项目,您必须坚持
使用
该项目标签 。
您可能会在package.json
中
强制该插件的5.6.2版本保持兼容性,直到您想要切换到g
map
-
vue
为止。
对于那些
使用
带有此插件的群集的用户,新版本可能会造成问题。 对于此插件网站演示,我必须创建,其
中
包含群集在
vue
-g
map
中
使用
的群集图像。 如果您对此有疑问,只需在
vue
项目的公共文件夹
中
使用
上面链接
中
Vue
2是一种被广泛
使用
的JavaScript框架,它提供了一些方便的功能来简化开发人员的工作。其
中
,
使用
render函数
自定义
组件是
Vue
2
中
非常强大的一个功能。render函数是一种能够将虚拟DOM转换为实际DOM的函数。通过
使用
render函数,您可以
自定义
组件并控制其整个生命周期。以下是
Vue
2
中
使用
render
自定义
组件的步骤:
第一步,导入
Vue
和render函数。您需要在组件
中
导入
Vue
和渲染函数。
import
Vue
from '
vue
'
import { render } from '
vue
-server-renderer'
第二步,定义组件。您需要定义一个组件,这个组件可以包含其他组件和HTML元素。在这里,我们将定义一个简单的组件。
const HelloWorld =
Vue
.component('hello-world', {
render() {
return (
<h1>Hello World</h1>
第三步,渲染组件。您需要
使用
Vue
的渲染函数将组件渲染到HTML
中
。
const app = new
Vue
({
render(h) {
return h(HelloWorld)
const html = renderToString(app)
console.log(html)
第四步,
使用
组件。您可以在您的
Vue
应用程序
中
使用
这个组件,只需要像以下这样导入它。
import HelloWorld from './HelloWorld.
vue
'
export default {
components: {
HelloWorld
通过这些简单的步骤,您可以
使用
Vue
2
中
的render函数来创建
自定义
组件,而无需
使用
Vue
的模板语法。这种技术可以让您更加灵活地控制组件,并且可以让您更好地理解
Vue
的内部工作原理。