技能四十六 正确使用第三方map(百度,高德,腾讯)实现地图效果
如果你想使用第三方地图服务(如百度地图,高德地图,腾讯地图等)实现地图效果,你需要首先注册相关服务的开发者账号,并获取相关的API密钥。
接下来,你需要在你的项目中引入相关的第三方地图库,通常这些地图库都会提供相应的使用文档和示例代码。
一般来说,实现地图效果需要以下步骤:
1.初始化地图:一般需要指定地图的容器和初始的中心位置及缩放级别。 例如,在百度地图中,可以使用 BMap.Map 对象进行初始化:var map = new BMap.Map("container",{center:new BMap.Point(116.404, 39.915),zoom:14});,这里 container 是指地图容器的 DOM 元素。
2.添加覆盖物:覆盖物主要用于在地图上标注点、折线、多边形等,不同的地图库所支持的覆盖物类型可能不同。 例如,在百度地图中,可以使用 BMap.Marker 对象来添加点覆盖物:var marker = new BMap.Marker(point); map.addOverlay(marker);,这里 point 是 BMap.Point 对象表示的点的经纬度。
3.事件处理:地图上的事件处理和普通的 DOM 元素事件处理类似,你可以在地图相关的对象上绑定事件处理函数来响应相应的事件。 例如,在百度地图中,可以使用 BMap.Map 对象的 addEventListener 方法来绑定事件处理函数:map.addEventListener("click", function(e){ alert(e.point.lng + ", " + e.point.lat); });,这里的 click 事件表示地图被点击时触发,e 表示事件对象,e.point.lng 和 e.point.lat 分别表示点的经度和纬度。
示例代码: 简单的示例代码,以百度地图为例:
1.初始化地图:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>百度地图示例</title>
<style type="text/css">
#map{
width: 800px;
height: 600px;
}
</style>
</head>
<body>
<div id="map"></div>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=your-app-key"></script>
<script type="text/javascript">
var map = new BMap.Map("map", {
center: new BMap.Point(116.404, 39.915),
zoom: 15
});
</script>
</body>
</html>
html复制代码
2.添加覆盖物:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>百度地图示例</title>
<style type="text/css">
#map{
width: 800px;
height: 600px;
}
</style>
</head>
<body>
<div id="map"></div>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=your-app-key"></script>
<script type="text/javascript">
var map = new BMap.Map("map", {
center: new BMap.Point(116.404, 39.915),
zoom: 15
});
var point = new BMap.Point(116.404, 39.915);
var marker = new BMap.Marker(point);
map.addOverlay(marker);
</script>
</body>
</html>
html复制代码
3.事件处理:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>百度地图示例</title>
<style type="text/css">
#map{
width: 800px;
height: 600px;
}
</style>
</head>
<body>
<div id="map"></div>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=your-app-key"></script>
<script type="text/javascript">
var map = new BMap.Map("map", {
center: new BMap.Point(116.404, 39.915),
zoom: 15
});
map.addEventListener("click", function(e) {
alert(e.point.lng + ", " + e.point.lat);
});
</script>
</body>
</html>
html复制代码
这些示例只是一些简单的用法,更多的使用方法需要参考相应的地图库文档和示例代码。注意在使用这些代码时,需要将 your-app-key 替换为你申请到的 API 密钥。
技能四十七 el-form和el-tree做数据回填
el-form 的数据回填,你可以将数据传递给 model 属性即可。例如:
<template>
<el-form :model="formData">
<el-form-item label="姓名">
<el-input v-model="formData.name"></el-input>
</el-form-item>
<el-form-item label="年龄">
<el-input v-model.number="formData.age"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSubmit">提交</el-button>
</el-form-item>
</el-form>
</template>
<script>
export default {
data() {
return {
formData: {
name: '',
age: null
}
}
},
methods: {
handleSubmit() {
// 处理表单提交
}
},
mounted() {
// 模拟数据回填
this.formData.name = '张三'
this.formData.age = 18
}
}
</script>
html复制代码
对于 el-tree 的数据回填,你需要遍历数据,判断节点是否需要勾选,并调用 setCheckedKeys 方法进行设置。例如:
<template>
<el-tree
:data="treeData"
:props="treeProps"
:default-expanded-keys="[1]"
@check="handleCheck">
</el-tree>
</template>
<script>
export default {
data() {
return {
treeData: [
{
id: 1,
label: '一级菜单',
children: [
{
id: 2,
label: '二级菜单-1',
children: [
{
id: 3,
label: '三级菜单-1'
},
{
id: 4,
label: '三级菜单-2'
}
]
},
{
id: 5,
label: '二级菜单-2'
}
]
}
]
}
},
computed: {
treeProps() {
return {
label: 'label',
children: 'children',
nodeKey: 'id',
checkStrictly: true
}
}
},
methods: {
handleCheck(data, checked) {
data.forEach(node => {
if (node.children) {
this.handleCheck(node.children, checked)
}
if (checked) {
// 模拟数据回填,假设 id 为 4 的节点需要勾选
if (node.id === 4) {
this.$refs.tree.setCheckedKeys([node.id], true)
}
} else {
this.$refs.tree.setCheckedKeys([node.id], false)
}
})
}
}
}
</script>
html复制代码
这里使用了 setCheckedKeys 方法,第一个参数为要选中的节点的 id 数组,第二个参数表示是否选中。如果需要默认选中节点,可以将要选中节点的 id 数组传递给 default-checked-keys 属性即可。
技能四十八 使用vue.use对自定义组件|指令进行快速注册
在 Vue 中,通过使用 Vue.use 方法可以快速注册自定义组件和指令,方便我们在全局范围内使用。以下是具体的使用方法:
- 在自定义组件或指令文件中,使用
Vue.component或Vue.directive方法注册组件或指令:
// 自定义组件
import MyComponent from './MyComponent.vue'
export default {
components: {
MyComponent
},
// ...
}
// 自定义指令
export default {
// ...
directives: {
myDirective: {
// 指令定义
}
}
}
js复制代码
- 在入口文件 (如
main.js中),使用Vue.use方法注册自定义组件和指令,例如:
import Vue from 'vue'
import MyComponent from '@/components/MyComponent.vue'
import MyDirective from '@/directives/MyDirective.js'
import App from './App.vue'
Vue.use(MyComponent)
Vue.use(MyDirective)
new Vue({
render: h => h(App)
}).$mount('#app')
js复制代码
- 现在,在任何
Vue组件或实例中,都可以使用你注册的自定义组件和指令了:
<template>
<div>
<my-component/>
<div v-my-directive>Select me</div>
</div>
</template>
<script>
export default {
// ...
}
</script>
vue复制代码
注意事项:
- 使用
Vue.use方法注册的组件和指令必须是Vue.component和Vue.directive所注册的组件和指令。如果你的组件或指令已经被注册过,会产生警告提示。 - 如果你的组件或指令依赖了一些库,确保在注册前已经安装并引入了这些依赖。
- 通常情况下,建议仅在全局范围需要用到的组件和指令上使用
Vue.use方法进行注册,避免全局污染。对于只需要在局部组件中使用的组件和指令,可以直接在组件内使用局部注册的方式进行注册,例如:components和directives属性。
技能四十九 实现el-table的行内编辑效果
el-table 中实现行内编辑的效果,可以采用以下的步骤。
- 首先,我们需要为表格添加一个
edit属性,用于记录当前正在编辑的行的row数据。
<el-table :data="tableData" style="width: 100%;" @row-click="handleRowClick">
<el-table-column prop="name" label="姓名"></el-table-column>
<el-table-column prop="age" label="年龄"></el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button type="primary" icon="el-icon-edit" @click.stop="handleEdit(scope.row)">编辑</el-button>
<el-button type="danger" icon="el-icon-delete" @click.stop="handleDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
vue复制代码
export default {
data() {
return {
tableData: [
{ name: '张三', age: 20 },
{ name: '李四', age: 25 },
{ name: '王五', age: 30 }
],
edit: {} // 记录当前编辑的行的数据
}
},
methods: {
handleEdit(row) {
this.edit = Object.assign({}, row) // 克隆一份数据用于编辑
},
handleDelete(row) {
// ...
},
handleRowClick(row, column, event) {
if (!this.edit.hasOwnProperty('name') || confirm('确认取消编辑?')) {
this.edit = {} // 点击空白处或其他行时,清空正在编辑的行的数据
}
}
}
}
js复制代码
- 接下来,我们需要在
el-table-column中添加额外的slot-scope,用于判断是否处于编辑状态。同时,添加一个input组件,与row数据进行双向绑定,实现编辑数据的效果。
<el-table-column prop="name" label="姓名">
<template slot-scope="{ row }">
<template v-if="edit === row">
<el-input v-model="edit.name" size="mini" @blur="handleSave"></el-input>
</template>
<template v-else>{{ row.name }}</template>
</template>
</el-table-column>
vue复制代码
export default {
// ...
methods: {
// ...
handleSave() {
Object.assign(this.edit, { age: parseInt(this.edit.age) }) // 修改提交的数据
Object.assign(this.tableData.find(row => row.name === this.edit.name), this.edit) // 将编辑后的数据复制回原数据中
this.edit = {} // 清空编辑的数据
}
}
}
js复制代码
- 最后,我们需要在操作列中添加一个保存和取消按钮,用于提交和取消编辑操作。我们同样需要使用
slot-scope来进行判断,是否处于编辑状态。
<el-table-column label="操作">
<template slot-scope="scope">
<template v-if="edit === scope.row">
<el-button type="success" size="mini" @click="handleSave">保存</el-button>
<el-button size="mini" @click="handleCancel">取消</el-button>
</template>
<template v-else>
<el-button type="primary" icon="el-icon-edit" size="mini" @click.stop="handleEdit(scope.row)">编辑</el-button>
<el-button type="danger" icon="el-icon-delete" size="mini" @click.stop="handleDelete(scope.row)">删除</el-button>
</template>
</template>
</el-table-column>
vue复制代码
export default {
// ...
methods: {
// ...
handleCancel() {
this.edit = {} // 清空正在编辑的行的数据
}
}
}
js复制代码
到此为止,行内编辑的功能就完成了。