vue 前端页面开发经验记录

这篇具有很好参考价值的文章主要介绍了vue 前端页面开发经验记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本博文记录了在vue项目开发中的一些经验,具体包含:class动态绑定、子页面刷新、注入函数到子页面、数据加载效果、单击后编辑、文件上传、数据分页、表单提交等的使用记录。

1、class动态绑定

根据变量的值绑定不同的class样式,这里ftype的值可为full_label、zero_label、has_label三种class样式名

        <div class="folderImg" :class="ftype" @click="to_url('showimglist',fd.name)">
          <i class="el-icon-folder-opened avatar-uploader-icon"></i>
        </div>

对应的class设置有

.full_label {
  background-image: url(../../assets/full_label.png);
  background-repeat:no-repeat;
  background-size:100% 100%;
  -moz-background-size:100% 100%;
}

.zero_label {
  background-image: url(../../assets/zero_label.png);
  background-repeat:no-repeat;
  background-size:100% 100%;
  -moz-background-size:100% 100%;
}

.has_label {
  background-image: url(../../assets/has_label.png);
  background-repeat:no-repeat;
  background-size:100% 100%;
  -moz-background-size:100% 100%;
}

2、子页面刷新 | 注入函数到子页面

通过v-if的方式设置子页面不可见,然后在this.$nextTick设置子页面可见,从而实现对子页面的刷新。然后将封装为reload函数,并注入函数到子页面,在子页面调用即可。
具体参考:https://www.jb51.net/article/260561.htm

<template>
  <div id="app">
    <!--img src="./assets/logo.png"-->
    <router-view v-if="isRouterAlive"></router-view>
  </div>
</template>
<script>
import axios from 'axios'
export default {
  name: 'App',
  provide () { //设置被注入到子页面的函数
    return {
      reload: this.reload,
    }
  },
  data () {
    return {
      isRouterAlive: true,
    }
  },
  methods: {
    reload () {
      this.isRouterAlive = false
      this.$nextTick(function () {
        this.isRouterAlive = true
      })
    },
  }
}
</script>

子页面的js中设置inject即可在子页面刷新内容

//子页面
  <script>   
  export default {
    name: 'showanalysis',
    inject: ['reload'], //接收父页面注入的内容
  }
  </script>

3、数据加载效果

用于服务器返回结果中的过程界面(当前端调用后台接口时触发该效果,获取到结果后取消显示)

具体参考 https://element.faas.ele.me/#/zh-CN/component/loading#loading-jia-zai
vue 前端页面开发经验记录,前端开发记录,vue.js,前端,javascript
具体用例如下,在元素中添加v-loading属性绑定变量loading,默认为false不显示效果;当触发其他耗时操作时,修改loading为true,显示加载中效果;当操作完成时,修改loading为false。

<template>
  <div class="demo-image"
  v-loading="loading"
  element-loading-text="等待服务器处理中"
  element-loading-spinner="el-icon-loading"
  element-loading-background="rgba(0, 0, 0, 0.8)"
 >
  </div>
</template>
  
<script>

export default {
  name: 'showdatafolder',
  data() {
    return {
      loading: false,
    }
  },
  }
}
</script>

4、宽高百分比

使用vh,vw来控制元素相对于屏幕的宽高百分比。vh和wh是视口单位,是相对长度单位。wh是相对于视口的宽度,“1vw”等于视口宽度的“1%”;而vh是相对于视口的高度,“1vh”等于视口高度的“1%”

具体参考:https://www.php.cn/faq/489349.html

5、单击后编辑

text类控件在单击后转换为input控件,在失去焦点后又变换text类空间。
以下为el-button控件与el-input控件的结合,当点击el-button后,与之对应的el-input展示,当el-input失去焦点后又显示为el-button。

<el-input
  class="input-new-tag"
  v-if="inputVisible"
  v-model="inputValue"
  ref="saveTagInput"  #为控件取了一个名字
  size="small"
  @keyup.enter.native="handleInputConfirm"
  @blur="handleInputConfirm"
>
</el-input>
<el-button v-else class="button-new-tag" size="small" @click="showInput">+ New Tag</el-button>


<script>
  export default {
    data() {
      return {
        dynamicTags: ['标签一', '标签二', '标签三'],
        inputVisible: false,
        inputValue: ''
      };
    },
    methods: {
      showInput() {
        this.inputVisible = true;
        this.$nextTick(_ => {
          this.$refs.saveTagInput.$refs.input.focus();//设置指定控件获取输入焦点
        });
      },
      handleInputConfirm() {
        let inputValue = this.inputValue;
        if (inputValue) {
          this.dynamicTags.push(inputValue);
        }
        this.inputVisible = false;
        this.inputValue = '';
      }
    }
  }
</script>

关键解析:
1、通过v-if='inputVisible' , v-else,绑定变量inputVisible设置el-button与与el-input的显示切换
2、为el-input控件设置ref,既为控件取名字。当点击button时,触发showInput事件,设置el-input可见,并获取输入焦点
3、通过设置el-input的@blur与@keyup.enter.native属性,对输入完成后的操作进行监听,并设置inputVisible = false 输入框不可见,inputValue = '' 输入框的值为空`

代码参考自:https://element.faas.ele.me/#/zh-CN/component/tag

单击前效果

vue 前端页面开发经验记录,前端开发记录,vue.js,前端,javascript
控件输入时效果
vue 前端页面开发经验记录,前端开发记录,vue.js,前端,javascript

6、文件上传

这里仅实现最简单的文件上传方式,多文件上传(实质为多次调用文件上传接口)请参考 https://element.faas.ele.me/#/zh-CN/component/upload

html页面

设置action为null,主要是在:before-upload所绑定的函数中实现文件上传

      <el-upload class="upload-demo" drag action="null" :before-upload="beforeAvatarUpload">
        <i class="el-icon-upload"></i>
        <div class="el-upload__text">将pt文件拖到此处,或<em>点击上传</em></div>
        <div class="el-upload__tip" slot="tip">只能上传pt文件,且不超过500kb</div>
      </el-upload>
js实现

在beforeAvatarUpload函数中,可以对文件后缀、文件size进行判断,最后使用axios创建post请求将文件提交到后端

    beforeAvatarUpload(file) {
      import axios from 'axios'
      const isAllow = file.name.indexOf('.pt') > 0 || file.name.indexOf('.PT') > 0;
      const isLt200M = file.size / 1024 / 1024 / 200;
      if (!isAllow) {
        this.$message.error("只允许上传pt文件!");
        return false
      } else if (!isLt200M) {
        this.$message.error('上传模型大小不能超过 200MB!');
        return false
      } else {
        //手动进行文件上传
        let formData = new FormData();
        formData.append("file", file);
        axios({
          url: "/api/uploader",//上传文件接口
          method: "post",
          headers: {
            "Content-Type": "multipart/form-data",
          },
          data: formData,
        }).then((res) => {
          this.$message({
            title: '结果提示',
            message: res.data.msg,
            type: 'success'
          });
          this.reload();
        });
      }
      return false
    },
后端代码

后端基于flask实现

@app.route('/uploader',methods=['GET','POST'])
def uploader():
    if request.method == 'POST':
        f = request.files['file']#跟表单里file中的name要一样
        spath=os.path.join(runDir, f.filename)
        print(spath)
        f.save(spath)
        json={'code':0,'msg':'文件上传成功!'}
        return jsonify(json) 
    else:
        return 'please uplaod file use post method!'

更多内容参考 https://element.faas.ele.me/#/zh-CN/component/upload

7、数据分页

在element-ui中详细介绍了分页控件的用法,但并未配合任何具体案例介绍。https://element.faas.ele.me/#/zh-CN/component/pagination

html页面

第一个部件为grid-content,里面v-for循环对应变量img_list,用于显示分页的具体内容
第二部分为el-pagination控件,对应具体的分页控件。可以通过修改layout对应的text,实现对分页部件内容的位置控制

<template>
  <div class="demo-image"
  >
    <el-row>
        <div class="grid-content">
          <div class="block" v-for="d in img_list" :key="d">
            <div class="demo-image__preview">
              <el-image style="width: 200px; height: 200px" :src="d" :preview-src-list="img_list">
              </el-image>
              <div class="bottom clearfix">
                <el-button type="text" class="button" @click="to_url('labelimg',{'currentImage':d})">标注</el-button>
                <el-button type="text" class="button" @click="delete_img(d)">删除</el-button>
              </div>
            </div>
          </div>
        </div>
    </el-row>
    <el-row>
        <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="0"
          :page-sizes="[6, 8, 10, 12, 15, 18]" :page-size="default_page_size"
          layout="total, sizes, prev, pager, next, jumper" :total="all_img_list.length">
        </el-pagination>
    </el-row>

  </div>
</template>
js实现

主要涉及的变量有all_img_list | 所有的数据、img_list | 当前分页的数据、default_page_size | 每一页的数据量、default_page | 当前页。
在页面初始化的时候,既mounted函数中获取全部数据设置到all_img_list中,并根据default_page_size、default_page截取当前页内容设置到img_list中。

<script>
import axios from 'axios'
export default {
  name: 'showimglist',
  data() {
    return {
      all_img_list: [],
      img_list: [],
      default_page_size: 10,
      default_page: 1,
    }
  },
  mounted() {
    if(this.$route.query.dname){
      localStorage.setItem('dname', this.$route.query.dname);
    }
    let dname = localStorage.getItem('dname');//this.$route.params.dname;
    this.dname=dname;
    if (dname) {
      let formData = new FormData();
      formData.append("dname", dname);
      axios({
        url: '/api/datamanage_get_imglist',//上传文件接口
        method: "post",
        headers: {
          "Content-Type": "multipart/form-data",
        },
        data: formData,
      }).then((res) => {
        this.all_img_list = res.data;
        this.img_list = this.all_img_list.slice(0, this.default_page_size)
      });
    }
  },
  methods: {
    handleSizeChange(val) {
      this.default_page_size = val;
      this.img_list = this.all_img_list.slice((this.default_page - 1) * this.default_page_size, this.default_page * this.default_page_size);
    },
    handleCurrentChange(val) {
      this.default_page = val
      this.img_list = this.all_img_list.slice((this.default_page - 1) * this.default_page_size, this.default_page * this.default_page_size);
    },
    
  }
}
</script>

以上代码中,handleSizeChange用于监听分页数量的改变,handleCurrentChange用于检测页码数的改变

后端实现

这里的分页本质上与后端没有任何关系,每次分页时并未向后端请求对应页码的数据,仅在已有数据中进行截取。
当总数据较多时,可以在handleSizeChange与handleCurrentChange中实时从后端获取数据。

最终实现的页面效果如下
vue 前端页面开发经验记录,前端开发记录,vue.js,前端,javascript

8、表单提交

表单实现

以下表单所绑定的为json对象:model="ruleForm",故此v-model="ruleForm.name"其el-form-item所绑定的为ruleForm.name,同时还:rules="rules"绑定了验证规则rules,ref="ruleForm" 表单被命名为ruleForm。
由submitForm事件提交表单

  <el-form :model="ruleForm" :rules="rules" ref="ruleForm"  
  style="padding: 30px;width:400px;background-color: bisque;" label-width="100px" class="demo-ruleForm">
    <el-form-item label="用户名" prop="name">
      <el-input v-model="ruleForm.name"></el-input>
    </el-form-item>
    <el-form-item label="密码" prop="pwd">
      <el-input type="password" v-model="ruleForm.pwd"></el-input>
    </el-form-item>
    <el-form-item>
      <el-button type="primary" @click="submitForm('ruleForm')">立即登录</el-button>
      <el-button @click="resetForm('ruleForm')">重置</el-button>
    </el-form-item>
  </el-form>
表单验证及提交

ruleForm对象为表单所绑定的数据模型
rules为表单具体字段的验证规则,针对每一个字段都可以设置多条规则
submitForm函数实现表单的验证及提交

 export default {
    name: 'login',
    data() {
      return {
        ruleForm: {
          name: '',
          pwd: '',
        },
        rules: {
          name: [
            { required: true, message: '请输入用户名', trigger: 'blur' },
            { min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' }
          ],
          pwd: [
            { required: true, message: '请输入密码', trigger: 'blur' },
            { min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' }
          ],
        }
      };
    },
      methods: {
        submitForm(formName) {
          this.$refs[formName].validate((valid) => {
            if (valid) {//表单验证成功,进入后台主页
              this.$router.push({name:'mainframe'});
            } else {
              console.log('error submit!!');
              return false;
            }
          });
        },
        resetForm(formName) {
          this.$refs[formName].resetFields();
        }
      }
    }

vue 前端页面开发经验记录,前端开发记录,vue.js,前端,javascript

9、网站打包部署

网站资源打包
npm run build

网站打包后各种静态资源url错误:
https://www.muzhuangnet.com/show/60711.html

10、网站打包时保护源码

***亲测无效:https://www.jianshu.com/p/0bf0aae8cc0d ***
找到config/index.js 将以下代码注释掉,即可看不到vue源码了。
devtool: ‘#source-map’,

vue 前端页面开发经验记录,前端开发记录,vue.js,前端,javascript文章来源地址https://www.toymoban.com/news/detail-630604.html

到了这里,关于vue 前端页面开发经验记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端开发 5: Vue.js 框架

    在前端开发中,Vue.js 是一个流行且灵活的 JavaScript 框架,用于构建用户界面。它采用了组件化的开发方式,使得前端开发更加模块化和可维护。在本篇博客中,我将为你介绍 Vue.js 的基础知识和常用技巧,帮助你更好地掌握前端开发中的框架部分。 Vue.js 是一个轻量级的 Jav

    2024年01月19日
    浏览(45)
  • Vue.js 现代前端开发的利器

    作者:阿发家的阿花 在当今的前端开发领域,Vue.js已经成为最受欢迎的JavaScript框架之一。它的简洁性、灵活性和强大的功能使其成为许多开发者首选的工具。本文将介绍Vue.js的核心概念、主要特点以及为什么它在现代前端开发中如此重要。我们还将探讨Vue.js在构建交互式和

    2024年02月10日
    浏览(51)
  • 《Vue.js前端开发实战》课后习题答案

    本答案仅供参考,禁止用于抄袭等不法用途 一、 填空题 用户界面 ViewModel refs vue-devtools 组件 二、 判断题 对 对 对 对 对 三、 选择题 D C D A A 四、 简答题 请简述什么是Vue。 Vue(读音/Vjuː/,类似于View)是一套用于构建用户界面的渐进式框架,与其他大型框架相比,Vue被设计

    2024年02月03日
    浏览(61)
  • [HTML]Web前端开发技术13(HTML5、CSS3、JavaScript )横向二级导航菜单 Web页面设计实例——喵喵画网页

    希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重要! 目录 前言 横向二级导航菜单 Web页面设计实例 总结 该练的还是要练,终究是自己的! 网页标题:二级下拉导航

    2024年01月17日
    浏览(73)
  • 常见的web前端开发框架:Vue.js

            常见的Web前端开发框架包括Bootstrap、Vue.js、React.js、Angular.js等。每个框架都有其独特的特点和优势,开发者可以根据项目的需求和个人的喜好来选择合适的框架。同时,随着技术的不断发展,新的框架和工具也会不断涌现,为Web前端开发带来更多的选择和可能性。

    2024年02月20日
    浏览(49)
  • Web前端开发技术课程大作业: 关于美食的HTML网页设计——HTML+CSS+JavaScript在线美食订餐网站html模板源码30个页面:

    👨‍🎓静态网站的编写主要是用HTML DIV+CSS JS等来完成页面的排版设计👩‍🎓,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等,用的最多的还是DW,当然不同软件写出的前端Html5代码都是一致的,本网页适合修改成为各种类型的产品展示网页,比

    2024年02月12日
    浏览(95)
  • Vue.js 3 项目开发:迈向现代化前端开发的必经之路

    随着前端技术的不断发展,Vue.js作为一种轻量级的JavaScript框架,已经逐渐成为了前端开发者的首选。Vue.js 3有哪些新特性、优势以及如何高效地进行项目开发呢? Vue.js是一种用于构建用户界面的渐进式框架。它的核心库专注于视图层,易于与其他库或现有项目集成。Vue.js 3是

    2024年01月23日
    浏览(53)
  • Jeecg开发框架前端VUE2数据页面与后端数据库交互实现

    ​ JeecgBoot 是一款基于代码生成器的 低代码 开发平台,零代码开发!采用前后端分离架构:SpringBoot2.x,Ant DesignVue,Mybatis-plus,Shiro,JWT。强大的代码生成器让前后端代码一键生成,无需写任何代码! JeecgBoot引领新的开发模式(Online Coding模式- 代码生成器模式- 手工MERGE智能开发

    2024年02月11日
    浏览(44)
  • 使用JavaScript和Vue.js框架开发的电子商务网站,实现商品展示和购物车功能

    引言: 随着互联网的快速发展和智能手机的普及,电子商务行业正迎来一个全新的时代。越来越多的消费者选择网上购物,而不再局限于传统的实体店。这种趋势不仅仅是改变了消费者的习惯购物,也给企业带来了巨大的商机。为了不断满足消费者的需求,电子商务网站需要

    2024年02月15日
    浏览(59)
  • 在前端开发中,何时应该使用 jQuery,何时应该使用 Vue.js

    如果您是最近才开始进入 Web 前端开发领域的开发人员,那么您可能会听说过 jQuery。jQuery 是一个小巧而功能强大的 JavaScript 库,旨在简化跨浏览器 DOM 操作、事件处理、动画效果和 AJAX 等方面的操作,可以让开发人员更轻松地开发出高质量的网站和 Web 应用程序。 何时应该使

    2024年02月02日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包