[TOC]

一个vue组件代码写法

<template>
  <div class="cs-main-home"></div>
</template>
<script>
import wpsPreview from "@/mixins/wps.js";
export default {
  name: "Home",
};
</script>
<style lang="less" scoped>
  .cs-main-home {}
  /deep/.ivu-tabs-bar { margin-bottom: 5px; }
</style>

1. script部分写法

<script>
import QueryConditions from './query-coditions';
export default {
  // 组件名字:只有作为组件选项时起作用。允许组件模板递归地调用自身。注意,组件在全局用 Vue.component() 注册时,全局 ID 自动作为组件的 name。
  // 指定 name 选项的另一个好处是便于调试。有名字的组件有更友好的警告信息。另外,当在有 vue-devtools,未命名组件将显示成 <AnonymousComponent>,这很没有语义。通过提供 name 选项,可以获得更有语义信息的组件树。
  name: 'Home',
  // 引入组件:值必须是对象,
  components: {
    QueryConditions
  },
  // 自定义组件的 v-model, 覆盖默认value属性和input事件
  model: {
    prop: 'fatherData', // 指定v-model属性接受数值,需要在props里面声明
    event: 'changeData'// 指定事件回送数据给父组件
  },
  // props 属性
  props: {
    fatherData: '',
    fileName: {
      type: String,
      required: true
    },
  },
  // 组件自己的属性定义处
  data() {
    return { a: 10 };
  },
  // 组件生命周期
  created() { },
  mounted() { },
    
  // 计算属性:
  // 当 a 属性 发生变化时,需要 aDouble 也发生变化时,使用 computed,
  // 1,computed中声明的属性,不需要在 data方法中声明了。
  // 2. 不能使用箭头函数,应为箭头函数没有this,获取不到data()中数据
  computed: {
    // 仅读取
    aDouble: function () {
      return this.a * 2
    },
    // 仅读取,另一种写法
    isTen() {
      let flag = false;
      if (this.a === 10) {
        flag = true;
      }
      return flag;
    }
    // 读取和设置
    aPlus: {
      get: function () {
        return this.a + 1
      },
      set: function (v) {
        this.a = v - 1
      }
    }
  },

  // 侦听器:  在数据变化时执行异步或开销较大的操作
  // 在 a 变量发生改变时,会执行watch中对应 a 方法
  // 一个对象,键是需要观察的表达式,值是对应回调函数。值也可以是方法名,或者包含选项的对象。
  // Vue 实例将会在实例化时调用 $watch(),遍历 watch 对象的每一个 property。
  watch: {
    // 如果 `a` 发生改变,这个函数就会运行
    a: function (val, oldVal) {
      console.log('new: %s, old: %s', val, oldVal)
    },
  },

  // methods 将被混入到 Vue 实例中。可以直接通过 VM 实例访问这些方法,或者在指令表达式中使用。方法中的 this 自动绑定为 Vue 实例。
  methods: {
    plus: function () { this.a++ },
    getData() {}
  },
};
</script>
Last Updated: 11/13/2023, 5:53:54 PM