vue项目中引出的问题【一】

表单验证

给el-form 添加属性:rules='formLoginRules',formLoginRules则是验证规则

在data中定义formLoginRules的规则

export default {
  data() {
    return {
      loginForm: {
        username: "",
        password: ""
      },
      // 定义验证规则列表
      loginFormRules: {
        username: [
          { required: true, message: "请输入用户名", trigger: "blur" },
          { min: 3, max: 6, message: "长度在 3 到 6 个字符", trigger: "blur" }
        ],
        password: [
          { required: true, message: "请输入密码", trigger: "blur" },
          { min: 6, max: 8, message: "长度在 6 到 8 个字符", trigger: "blur" }
        ]
      }
    };
  }
};

通过prop属性设置验证规则

<el-form-item label="活动名称" prop="username">

以上验证只是给用户更好的交互体验,实则用户点击按钮后仍可以登录。所以我们应对定义的规则进行验证,通过则执行后面的请求,不通过则不请求

methods: {
    submitForm (form) {
      this.$refs.form.validate(valide => {
        console.log(valide)
        if (valide) {
          console.log('发送 ajax 请求')
        } else {
          console.log('不发送')
        }
      })
    }
  }

安装axios

npm i axios

在入口文件中使用挂载到Vue原型上的方法,方便所有组件使用

import axios from 'axios'
Vue.prototype.$http = axios

配置请求路径

因为请求的接口很多,但接口准基是一样的,所以我们可以设置一下根路径

接口准基

http://127.0.0.1:8888/api/private/v1/

配置

axios.defaults.baseURL = http://127.0.0.1:8888/api/private/v1/

请求接口

submitForm(form){
    this.$refs.form.validate(valid=>{
    if(valid===false){
        console.log('验证失败')
		return false
    }
	thia.$http.post('login',this.loginForm).then(res=>{
       const {status,msg} = res.data.meta
       if(status===400){
           console.log(msg)
           return false
       }
        const {data:{token}} = res.data
        localStorage.setItem('token',token)
    })

})
}

异步改造

submitForm(){
    try{
        await this.$refs.form.validate()
        var res = await this.$http.post('login',this.loginForm)
        var {status,msg} = res.data.meta
        if(status===400){
            console.log(msg)
            return false
        }
        console.log(msg)
        var {data:{token}} = res.data
        localStorage.setItem('token',token)
    }catch(err){
        console.log(err)
    }
}

async

async是ES7才有的与异步操作有关的关键字

返回值

async返回的是一个promise对象

async function f1(){
    return 'hello world'
}
console.log(f1())
//输出 Promise {<fulfilled>: "hello world"}

可以使用.then方法

f1().then(res=>{
	console.log(res)
})

await

await操作符用于等待一个promise对象,它只能在异步函数async异步函数中使用

function testAwait (x) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(x);
    }, 2000);
  });
}
 
async function helloAsync() {
  var x = await testAwait ("hello world");
  console.log(x); 
  console.log(1)
  console.log(2)
}
helloAsync ();
// hello world 1 2
  • Promise对象:await会暂停执行,等待Promise对象resolve,然后恢复async函数的执行并返回解析值
  • 非Promise:直接返回对应的值

成功跳转

this.$router.push('home')

点击退出时要清除token

localStorage.clear()
this.$router.push('/login')

提示弹框

使用element-ui中的this.$message显示提示弹框

    async submitForm (form) {
      try {
        await this.$refs.form.validate()
        var res = await this.$http.post('/login', this.loginForm)
        var { status, msg } = res.data.meta
        if (status === 400) {
           //简写方式
          this.$message.error(msg)
          return false
        }
        this.$message({
          message: msg,//提示消息
          type: 'success',//弹框类型
          duration: 2000,//显示时间
            //弹窗关闭后执行的回调函数,此处要使用箭头函数让this指向Vue实例
          onClose: () => {
            localStorage.setItem('login', res.data.data.token)
            this.$router.push('/home')
          }
        })
      } catch (err) {
        this.$message.error('验证失败')
      }
    }

路由守卫

因为在访问所有页面时都需要处于登录状态,也就是说必须存在token值。所以我们使用vue-router中的路由守卫来进行验证

.beforeEach()中有三个参数

  • to:到哪去
  • from:从哪来
  • next():要干嘛
router.beforeEach((to, from, next) => {
    //首先访问登陆页面
    if(to.path === '/login') {
        return next()
    }
    //判断是否有token值
    var token = localStorage.getItem('token')
    //没有则返回登陆页面
    if (!token) {
        return next('/login')
    }
    //有token则跳转页面
    next()
})

按需引入

这里以element-ui为例,如果不使用按需引入的话,文件打包成生产版本时会把所有组件全部存放进去,导致文件体积变大,所以我们就需要按需引入组件了

安装插件

npm install babel-plugin-component -D

修改 bable.config.js

module.exports = {
  presets: [
   	..........
  ],
   //添加代码
  plugins: [
    [
      'component',
      {
        libraryName: 'element-ui',
        styleLibraryName: 'theme-chalk'
      }
    ]
  ]
}

修改mian.js,合并按需引入的element-ui

import Vue from 'vue'
import { Button, Form, FormItem, Input, Message } from 'element-ui'

Vue.use(Button)
Vue.use(Form)
Vue.use(FormItem)
Vue.use(Input)
// 进行全局挂载:
Vue.prototype.$message = Message

运行 npm run build 命令,分别查看完整导入和按需导入打包后体积变化

img img

上传提交到码云

添加暂存区

git add .

添加到本地仓库

git commit -m '备注'

查看分支

git branch

切换主分支

git checkout master

合并分支

git merge login 

提交master到码云

git push

切换分支到login

git checkout login

提交到码云

git push -u origin login

添加暂存区

git add .

添加到本地仓库

git commit -m '备注'

查看分支

git branch

切换主分支

git checkout master

合并分支

git merge login 

提交master到码云

git push

切换分支到login

git checkout login

提交到码云

git push -u origin login
### 集成 SuperMap GIS 到 Vue3 项目 要在 Vue3 中引入和配置 SuperMap GIS 并加载现有的模型,可以按照以下方法实现: #### 安装依赖库 首先,在 Vue3 项目中安装所需的 npm 包 `supermap-iClient3D-for-Cesium` 和 `cesium`。 ```bash npm install supermap-iclient3d-for-cesium cesium --save ``` 这步会将必要的库下载到项目的 `node_modules` 文件夹中[^1]。 #### 初始化 Cesium Viewer 组件 在 Vue3 的组件文件中初始化 Cesium 的 Viewer 实例。可以通过创建个自定义的 Vue 组件来完成此操作。 ```javascript <template> <div id="cesiumContainer"></div> </template> <script> import * as Cesium from "cesium"; import "cesium/Build/Cesium/Widgets/widgets.css"; export default { name: "CesiumViewer", data() { return { viewer: null, }; }, mounted() { this.viewer = new Cesium.Viewer("cesiumContainer", { terrainProvider: Cesium.createWorldTerrain(), }); // 设置初始视图为中国区域 const cameraPosition = Cesium.Cartesian3.fromDegrees( 103.84, 31.15, 5_000_000 ); this.viewer.camera.setView({ destination: cameraPosition, }); }, }; </script> <style scoped> #cesiumContainer { width: 100%; height: 100vh; } </style> ``` 上述代码实现了基本的地图容器设置以及相机位置调整[^2]。 #### 加载地形与影像数据 为了加载地形和影像数据,需要调用 SuperMap 提供的服务接口。以下是具体实现方式: ```javascript mounted() { this.viewer = new Cesium.Viewer("cesiumContainer", { terrainProvider: Cesium.createWorldTerrain(), }); // 添加天地图作为底图 let tileLayer = this.viewer.scene.primitives.add( new Cesium.PrimitiveCollection() ); let imageryUrl = "https://t{s}.tianditu.gov.cn/DataServer?T=vec_w&X={x}&Y={y}&L={z}"; let terrainUrl = "https://t{s}.tianditu.gov.cn/DataServer?T=ter_w&X={x}&Y={y}&L={z}"; let tiandituImageryProvider = new Cesium.WebMapTileServiceImageryProvider({ url: imageryUrl.replace("{s}", Math.floor(Math.random() * 7)), layer: "", style: "", format: "image/jpeg", maximumLevel: 19, }); let tiandituTerrainProvider = new Cesium.WebMapTileServiceImageryProvider({ url: terrainUrl.replace("{s}", Math.floor(Math.random() * 7)), layer: "", style: "", format: "image/jpeg", maximumLevel: 19, }); this.viewer.imageryLayers.addImageryProvider(tiandituImageryProvider); this.viewer.terrainProvider = Cesium.createWorldTerrain({ requestWaterMask: true, requestVertexNormals: true, }); // 调整相机视角至目标区域 const cameraPosition = Cesium.Cartesian3.fromDegrees(116.4, 39.9, 500000); // 北京地区 this.viewer.camera.flyTo({ destination: cameraPosition, }); }, ``` 通过以上代码片段,能够成功加载天地图的矢量瓦片和地形数据,并将视角定位在北京地区[^3]。 #### 加载 3D 模型 (3DTiles) 如果需要加载已有的 3D 模型(例如 `.b3dm`, `.gltf` 或其他支持的格式),可以直接利用 Cesium 的 `Cesium3DTileset` 类。 ```javascript methods: { loadModel(url) { const tileset = this.viewer.scene.primitives.add( new Cesium.Cesium3DTileset({ url: url, }) ); tileset.readyPromise.then((tileset) => { console.log(`Model loaded successfully!`); this.viewer.zoomTo(tileset); }).catch((error) => { console.error('Error loading model:', error); }); } } // 使用时调用该函数 this.loadModel("http://example.com/path/to/model/tileset.json"); ``` 这段代码展示了如何动态加载外部托管的 3D 模型资源[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值