实习期间碰到的前端问题3

文章介绍了如何在Vue应用中使用el-input限制输入正整数,通过eventBus实现组件间参数传递,以及如何在Vue中集成高德地图并监听坐标变化。还讨论了watch和props的用法以及el-tabs组件的生命周期管理。
摘要由CSDN通过智能技术生成

1.el-input只希望输入正整数

oninput = "value=value.replace(/[^\d]+/g,'')" 

限制只能输入数字,如果输入非数字,会被替换为空(负号和小数点也会被替换,所有实际上等于只能输入正整数

value.replace(/[^\d]+/g,'')

  • value 是要进行替换操作的字符串。
  • replace() 是 JavaScript 的字符串方法,用于将匹配到的字符串进行替换。
  • /[^\d]+/g 是一个正则表达式,用于匹配除了数字(\d)之外的任意字符。其中,[^\d] 表示非数字字符,+ 表示匹配一个或多个连续的非数字字符,g 表示全局匹配,即匹配所有符合条件的非数字字符。
  • '' 是替换后的字符串,这里为空字符串,表示将匹配到的非数字字符替换为空格。

按照上述解释,可以进行更多自定义输入限制

2.组件间参数传递

之前只知道能以父组件为桥梁使得兄弟组件进行参数传递。这样问题就是限制太大,还必须要改父组件中代码,以及只能是兄弟组件。后面了解到可以使用eventBus实现参数传递。本质上就是使用eventBus来作为桥梁。

参考文献:Vue事件总线(EventBus)使用详细介绍 - 知乎 (zhihu.com)

3.watch和props

watch可以监听props并将新值赋予给当前组件内的变量

4.添加高德地图

实现结果示例:
请添加图片描述
首先需要(最先应该需要去官网注册开发者)

npm i @amap/amap-jsapi-loader --save

map.vue:

<template>
  <div>
    <div class="coordinate">
      <div class="toolbar">
        <div>坐标: [ {{ lng }} , {{ lat }} ]</div>
        <div>地址: {{ address }}</div>
      </div>
      <div style="width: 100%;height: 300px;">
        <div id="coordinateMap" class="coordinateMap" />
      </div>
    </div>
  </div>
</template>

<script>
import AMapLoader from '@amap/amap-jsapi-loader';

export default {
  name: "gaode",
  data() {
    return {
      map: null, //初始化 map 对象
      input:'',
      overlays: [],
      lng: '',
      lat: '',
      address: '',
      marker: '',
      geocoder: null,
      mouseTool: null,
    }
  },
  methods: {
    initMap() {
      window._AMapSecurityConfig = {
        securityJsCode: '填写你的安全代码' // 开发环境使用,为了安全考虑,正式环境不要暴露安全代码  
        //正式环境方案: https://lbs.amap.com/api/javascript-api-v2/guide/abc/jscode
      }
      AMapLoader.load({
        key: "填写你的key", //此处填入我们注册账号后获取的Key
        version: "2.0", //指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
        plugins: ['AMap.Scale','AMap.DistrictSearch', 'AMap.MouseTool', 'AMap.Geocoder'], //需要使用的的插件列表,如比例尺'AMap.Scale'等
      }).then((AMap) => {
        const that = this
        that.map = new AMap.Map('coordinateMap', {
          center: [104.06, 30.67],
          resizeEnable: true,
          expandZoomRange: true,
          zoom: 13,
          zooms: [3, 21]
        })
        that.drawBounds(that.map)
        // 异步同时加载多个插件
        // AMap.plugin([], function () {
        //   that.scale = new AMap.Scale()
        //   that.map.addControl(that.scale)
        // })
        that.mouseTool = new AMap.MouseTool(that.map)
        // 监听draw事件可获取画好的覆盖物
        that.mouseTool.on('draw', function (e) {
          that.overlays.push(e.obj)
          that.mouseTool.close()
        })

        that.geocoder = new AMap.Geocoder({
          radius: 1000,
          extensions: 'all'
        })
        that.marker = new AMap.Marker()
        // 点击获取坐标
        const clickHandler = function (e) {
          that.lng = e.lnglat.getLng()
          that.lat = e.lnglat.getLat()
          that.$emit("update:lng", that.lng);
          that.$emit("update:lat", that.lat);

          const lnglat = [that.lng, that.lat]
          that.map.add(that.marker)
          that.marker.setPosition(lnglat)
          that.getAddress(that.lng, that.lat)
        }
        that.map.on('click', clickHandler)
        
      }).catch(e => {
        console.log(e);
      })
    },

      selectAddress(e) {
        //这里获得点选地点的经纬度
        let location = e.selected.data.location;
        console.log('lng',location.lng);
        console.log('lat',location.lat);
        // Do Something
      },

    // 获取地址
    getAddress(lng, lat) {
      const that = this
      that.geocoder.getAddress([lng, lat], function (status, result) {
        if (status === 'complete' && result.info === 'OK') {
          if (result && result.regeocode) {
            that.address = result.regeocode.formattedAddress
            that.$emit("update:address", that.address);
            that.$nextTick()
          }
        }
      })
    },
    // 限制地图区域
    drawBounds(map) {
      const opts = {
        subdistrict: 0,
        extensions: 'all',
        level: 'city'
      }
      const district = new AMap.DistrictSearch(opts)
      district.setLevel('中国')
      district.search('中国', (status, result) => {
        const outer = [
          new AMap.LngLat(-360, 90, true),
          new AMap.LngLat(-360, -90, true),
          new AMap.LngLat(360, -90, true),
          new AMap.LngLat(360, 90, true)
        ]
        const holes = result.districtList[0].boundaries

        const pathArray = [outer]
        pathArray.push.apply(pathArray, holes)
        const polygon = new AMap.Polygon({
          pathL: pathArray,
          strokeColor: '#001826',
          strokeWeight: 1,
          strokeOpacity: 0.5,
          fillColor: '#ffffff',
          fillOpacity: 1,
          strokeStyle: 'dashed',
          strokeDasharray: [10, 2, 10]
        })
        polygon.setPath(pathArray)
        map.add(polygon)
      })
    },
    // 限制地图区域END
    close() {
      this.mouseTool.close(true)
    },
  },
  mounted() {
    //DOM初始化完成进行地图初始化
    this.initMap();
  }
}
</script>

<style>
#container {
  width: 80%;
  height: 400px;
  margin: 100px auto;
  border: 1px solid red;
}
</style>

<style lang="scss" scoped>
.coordinate {
  width: 100%;
  height: 100%;

  .coordinateMap {
    width: 100%;
    height: 100%;
  }
}
</style>

<style type="text/css">
  html,body,#app{
    height: 100%;
    width: 100%;
  }
  #panel {
    position: absolute;
    background-color: white;
    max-height: 90%;
    overflow-y: auto;
    top: 80px;
    right: 10px;
    width: 280px;
  }
</style>

然后在需要的地方以组件引入就可以了。
使用.sync可以将组件内部属性和外部绑定(要配合this.$emit(“update:xxx”, this.xxx))。
示例:

<gaode :lng.sync="dataForm1.longitude" :lat.sync="dataForm1.latitude" :address.sync="dataForm1.warehouseAddress"></gaode>

参考文献:

1.vue 高德地图点击获取坐标与地理位置_vue 高德地图点击覆盖物获取数据_发根强劲的博客-CSDN博客 (主要是参考这位大佬的,实现结果是一样的,只不过根据链接2大佬的内容微调了一下)
2.Vue项目中引入高德地图步骤详解_vue引入地图插件_小马大咖的博客-CSDN博客
3.彻底明白Vue2中.sync修饰符_vue2 .sync_duansamve的博客-CSDN博客

5.el-tabs切换时生命周期不起效果

使用v-if在每个el-tab-pane内的组件上判断 v-if="标签页名称==='xxx'" 可触发mounted,但是不触发activated。在使用keep-alive标签包裹后,成功触发activated

  <el-tab-pane label="标签页名称" name="标签页名称">
	<keep-alive>
        <自定义组件 ref="" v-show="tabName==='标签页名称'"></自定义组件>
    </keep-alive>
  </el-tab-pane>

参考:
1.
在这里插入图片描述
2. keep-alive 用法 及activated,deactivated这两个生命周期函数-CSDN博客

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 作为一名实习生,我在Web前端开发公司度过了愉快而充实的时光。在我的实习期间,我有幸参与了许多Web开发的项目,收获了许多宝贵的经验和技能。 我第一次看到Web前端开发时,我觉得这是一个神秘而又陌生的领域。但随着我逐渐融入这个行业,我开始学习HTML、CSS和JavaScript,尝试理解各种框架、库以及它们实现的功能。 我第一个参与的项目是一个微信小程序。我学习了小程序开发的流程和所需技能,并且与我的导师一起完成了这个项目。我还参与了一个网站的设计和开发,这个网站可以允许用户上传和分享图片。 在我的实习期间,我也学习了如何熟练地使用Git进行团队合作和版本管理。我学习了如何阅读并了解他人的代码,提出适当的修改意见和建议。 总的来说,我的实习期间是一个充满挑战和收获的经历。我不仅收获了宝贵的技能和经验,也结交了许多相应的行业人士。这个实习期对我个人和学术生涯都有着很大的影响,我十分感激这次经历。 ### 回答2: 我在一家互联网公司实习了三个月,担任web前端开发实习生。在公司中,我的工作主要负责网站的前端开发,包括设计、实现和优化网站的交互功能等。 我记得第一天来到公司,我感觉很紧张,毕竟这是我第一次来到互联网公司实习。但是我的导师很亲切,给我简单介绍了公司,领我去了我的办公区,并向我展示了公司的项目。 在接下来的几个星期里,我花费了很多的时间看文档和教程,学习了一些基础知识,例如HTML、CSS、JavaScript等等。之后,我开始着手开发我负责的页面,并且不断根据我的导师的建议进行优化。我的导师很有经验,总是会给我一些很有用的提示和意见。 我的实习结束了,我感觉我在公司里度过的三个月非常充实和有成效。除了在技术上有所提升,我还学到了很多项目管理、团队协作以及沟通的技巧。我希望这次实习能够为我未来的工作生涯奠定更好的基础。 ### 回答3: 我在一家互联网公司进行为期三个月的web前端开发实习。虽然我之前学过一些相关知识,但是在实际应用中,我遇到了很多困难,需要反复琢磨。 在这个实习过程中,我遇到了很多挑战。最初,我主要负责一些简单的页面设计和布局,但是随着实习的深入,我的任务越来越复杂。我需要开发动态网页,以及响应式布局。我学习了HTML、CSS、JavaScript等技术,并且学会了如何使用jQuery和Bootstrap等框架。 在制作网页的过程中,我发现自己的UI设计技能需要更进一步的提高。我学习了一些关于设计的知识,比如配色原则、字体搭配等等。我还尝试使用Sketch等工具来提高自己的设计技能。 在和同事们的交流中,我学到了如何更好地与团队协作。我们讨论了如何提高开发效率,如何更好地管理代码。我也与其他实习生分享了自己的学习心得,互相帮助。 总之,这个实习经历对我来说是非常宝贵的。我不仅学会了很多技能,还学会了如何与团队协作。我相信这个经历将对我未来的职业发展有很大的帮助。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值