Vue基本用法

Vue基本用法

1、Vue结构

javascript 复制代码
<template>
</template>

<script>
import component from '@/xxx' // 引用组件,组件名称随意,跟原vue文件名不相关,随意命名
import method from './yyy' // 引用JS方法包,方法包名称随意,跟原JS方法名不相关,随意命名

export default {
  name: 'xxx', // 组件名
  components: { component }, // 引用的组件
  mixins: [method()], // 引用的方法
  props: { // 暴露给父组件的属性
    prop1: { type: String, required: true }, // 属性1,约定了属性的类型、默认值、必要性
    prop2: { type: Number, default: 123 } // 属性2
  },
  data() { // 仅用于组件内部的变量
    return {
      attr1: null, // 变量1
      attr2: null, // 变量2
      rules: { // 表单属性校验
        attr1: [
          { required: true, message: 'xxx', trigger: 'blur' }
        ],
        attr3: [
          { required: true, message: 'xxx', trigger: 'change' }
        ]
      }
    }
  },
  methods: { // 自定义方法,大致有2类,一种是事件响应,另一种是逻辑处理
    method1() {
      // 方法1
    },
    method2() {
      // 方法2
    }
  },
  beforeCreate() { // 组件生命周期方法,beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyed
    // 创建前
  },
  created() {
    // 已创建,数据初始化已完成,但未挂载到DOM
  },
  beforeMount() {
    // 挂载前
  },
  mounted() {
    // 已挂载,已渲染完成,有具体的位置和大小等
  },
  beforeUpdate() {
    // 更新前
  },
  updated() {
    // 已更新
  },
  computed: { // 计算属性
    attr1: {
      get() {
        return this.attr1
      },
      set(val) {
        this.attr1 = val
      }
    },
    attr3() {
      return 'xxx'
    }
  },
  watch: { // 监控变量变化
    attr1(value) { // 被监控变量的名称

    },
    'attr2': function(val, oldVal) {

    }
  },
  beforeDestroy() {
    // 销毁前
  },
  destroyed() {
    // 已销毁
  }
}
</script>

<style scoped>
</style>

2、标签属性

javascript 复制代码
<template>
  <el-input value="123"/> <!-- 原生属性 -->
  <el-input>{{ attr }}</el-input> <!-- 字符串模板 -->
  <el-input v-model="attr"/> <!-- 绑定变量 -->
  <el-input :value="method()"/> <!-- @是v-bind的缩写,表示数据绑定,支持单值、多值、样式等 -->
  <el-button @click="onclick"/> <!-- @是v-on的缩写,表示事件回调或方法调用 -->
</template>

<script>
export default {
  data() {
    return {
      attr: 456
    }
  },
  methods: {
    method() {
      return 789
    },
    onclick() {

    }
  }
}
</script>

<style scoped>
</style>

3、组件保活

javascript 复制代码
<template>
  <keep-alive>
    <el-input v-model="value"/> <!-- 必须用keep-alive包裹 -->
  </keep-alive>
</template>

<script>

export default {
  data() {
    return {
      value: null
    }
  },
  activated() { // 生命周期函数(方法)
    // 耗时请求或巨量数据清空不需要重复获取的变量
    this.value = 123
  }
}
</script>

<style scoped>
</style>

4、导入导出

javascript 复制代码
// yyy.js 和 zzz.js
export function method1() {} // 单个方法导出
export function method2() {}

export default { method1, method2 } // 多个方法组合导出
javascript 复制代码
<template>
  <Component /> // 引用的组件
</template>

<script>
import Component from '@/xxx' // 导入其他组件,组件名称随意,但要与components声明一致
import yyyMethods from './yyy' // 导入其他JS文件,名称随意
import { method1, method2 } from '@/zzz' // 导入其他JS方法,并自动拆包

// 引用路径,@/xxx 是相对于项目根路径的表示方式,项目根路径一般为 /src
// 引用路径,./xxx 是相对于当前文件所在文件夹的路径的表示方式
    
export default {
  components: { Component }, // 引用的组件
  methods: {
    method() {
      yyyMethods.method1() // 方法调用方式1
      method2() // 方法调用方式2
    }
  }
}
</script>

<style scoped>
</style>

5、表单校验

javascript 复制代码
<template>
  <el-form ref="form" :rules="rules"> <!-- 表单名和规则名随意 -->
    <el-row>
      <el-col>
        <el-form-item label="变量1" prop="prop1"> <!-- 表单属性名随意 -->
          <el-input v-model="attr1"/> <!-- 这是组件变量,与表单中声明的属性没有直接关系,可以同名也可以不同名 -->
        </el-form-item>
        <el-form-item label="变量2" prop="prop2">
          <el-input v-model="attr2"/>
        </el-form-item>
      </el-col>
    </el-row>
    <el-row>
      <el-col>
        <el-button @click="onclick">点我</el-button>
      </el-col>
    </el-row>
  </el-form>
</template>

<script>
export default {
  data() {
    return {
      attr1: null, // 变量1
      attr2: null, // 变量2
      rules: { // 表单属性校验,名称随意
        prop1: [
          { required: true, message: '必填提示', trigger: 'blur' }, // 默认必填校验方法
          { max: 90, message: '长度不能超过90', trigger: 'change' } // 默认限长校验方法
        ],
        prop2: [
          {
            required: true,
            validator: (rule, value, callback) => { // 自定义校验方法
              if (!value) {
                callback(new Error('必填提示'))
              }
              callback() // 校验通过
            }
          }
        ]
      }
    }
  },
  methods: {
    onclick() {
      // 也可以 this.$refs.form.validate()
      this.$refs['form'].validate((valid) => {
        if (valid) { // 通过-true 不通过-false
          // 校验通过的处理
        }
      })
    }
  }
}
</script>

<style scoped>
</style>

6、接口方法

javascript 复制代码
// request.js
import axios from 'axios'
import { Notification } from 'element-ui'
import qs from 'qs'

// 后端服务提供的接口基地址
const service = axios.create({ baseURL: 'http://192.168.1.1:8080', timeout: 30 * 1000 })

// 接口请求主方法
function request(config) {
  if (config.method === 'get' && config.data) {
    config.url = config.url + '?' + qs.stringify(config.data, { indices: false })
  }
  return service(config)
}

// 前置拦截器,补充接口Token
service.interceptors.request.use(
  config => {
    config.headers['Authorization'] = 'Bearer xxx'
    config.headers['Content-Type'] = 'application/json'
    return config
  },
  error => {
    Promise.reject(error)
  }
)

// 后置处理器,默认的错误处理
service.interceptors.response.use(
  response => {
    if (200 !== response['code']) {
      Notification.error({ title: response.message })
      return Promise.reject(response.message)
    }
  },
  error => {
    Notification.error({ title: '接口请求失败', duration: 5000 })
    return Promise.reject(error)
  }
)
export default request
javascript 复制代码
// xxx.js
import request from '@/request'

export function method1(data) {
  return request({
    url: 'system/method1',
    method: 'get', // 增-post 删-delete 改-update 查-get
  	data
  })
}

export function method2(params) {
  return request({
    url: 'system/method2',
    method: 'post',
  	params
	// 数组入参在data表现为 /url?xxx=v1&xxx=v2
  	//        params表现为 /url?xxx[]=v1&xxx[]=v2
  })
}

export function method3() { // 一般不用这个方法
  return request({
    url: 'system/method3',
    method: 'update'
  }).then(res => {
    // 处理响应
  }).catch(err => {
    // 处理异常错
  })
}

export default { method1, method2, method3 }
javascript 复制代码
<template>
  <div @click="onclick"/>
</template>

<script>
import { method1, method2 } from './xxx'

export default {
  mixins: [method1(), method2()], // 引用其他JS方法
  data() {
    return {}
  },
  methods: {
    onclick() {
      method2().then((res) => {
		// 处理方法
      })
    }
  }
}
</script>

<style scoped>
</style>

7、钩子函数

javascript 复制代码
<template>
  <p ref="useDom">段落内容</p> <!-- 钩子关键词ref或hook,名称随意,一般以useXxx命名,同钩子获取原生DOM -->
  <el-button @click="getDom"/>
  <el-button @click="setDom"/>
</template>

<script>
export default {
  methods: {
    getDom() {
      console.log(this.$refs.useDom)
      // <p>段落内容</p>
    },
    setDom() {
      this.$refs.useDom.innerText = '新的段落内容'
    }
  }
}
</script>

<style scoped>
</style>

8、CRUD

javascript 复制代码
相关推荐
m0_748235619 分钟前
从零开始学前端之HTML(三)
前端·html
一个处女座的程序猿O(∩_∩)O2 小时前
小型 Vue 项目,该不该用 Pinia 、Vuex呢?
前端·javascript·vue.js
hackeroink5 小时前
【2024版】最新推荐好用的XSS漏洞扫描利用工具_xss扫描工具
前端·xss
迷雾漫步者7 小时前
Flutter组件————FloatingActionButton
前端·flutter·dart
向前看-7 小时前
验证码机制
前端·后端
燃先生._.8 小时前
Day-03 Vue(生命周期、生命周期钩子八个函数、工程化开发和脚手架、组件化开发、根组件、局部注册和全局注册的步骤)
前端·javascript·vue.js
高山我梦口香糖9 小时前
[react]searchParams转普通对象
开发语言·前端·javascript
m0_748235249 小时前
前端实现获取后端返回的文件流并下载
前端·状态模式
m0_7482402510 小时前
前端如何检测用户登录状态是否过期
前端