代码笔记1

:data=""  table中
v-bind:model="" :model="" form中
v-model指令的本质是:form-item中
1.它负责监听用户的输入事件,从而更新数据,并对一些极端场景进行一些特殊处理。
2.同时,v-model会忽略所有表单元素的value、checked、selected特性的初始值,它总是将vue实例中的数据作为数据来源。
3.然后当输入事件发生时,实时更新vue实例中的数据。

用v-bind和v-on指令实现v-model
<input type="text" @input="handleInput($event)"  placeholder="请输入"  v-bind:value="message">
==========================================
map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。
var array1 = [1,4,9,16];
const map1 = array1.map(x => x *2);
console.log(map1);
Array [2,8,18,32]
=========================================
el-table的数据源:data=, 单向绑定

vue + element UI <table>表格的常见的案例
https://www.jianshu.com/p/f1dd60cacfb5
==========================================
由于JavaScript的限制,Vue 无法检测到对数组的以下更改:
1. 当你用索引直接设置一个项目,例如 vm.items[indexOfItem] = newValue 
2. 当你修改数组的长度时,例如 vm.items.length = newLength 
为了克服注意事项1
// Vue.set
Vue.set(vm.items, indexOfItem, newValue)
// Array.prototype.splice
vm.items.splice(indexOfItem, 1, newValue)
为了克服注意事项2
vm.items.splice(newLength)
==========================================
Vue不允许向已创建的实例动态添加新的根级别反应属性。但是,可以使用该Vue.set(object, key, value)方法为嵌套对象添加反应性属性。例如,给出:
var vm = new Vue({
  data: {
    userProfile: {
      name: 'Anika'
    }
  }
})
您可以使用以下方法将新age属性添加到嵌套userProfile对象:
Vue.set(vm.userProfile, 'age', 27)
您也可以使用vm.$set实例方法,它是全局Vue.set的别名:
this.$set(this.userProfile, 'age', 27)
==========================================
带有v-if的v-for
当它们存在于同一个节点上时,v-for其优先级高于v-if。这意味着v-if将分别在循环的每次迭代中运行。当您想要渲染仅用于某些项目的节点时,这非常有用,如下所示:
<li v-for="todo in todos" v-if="!todo.isComplete">
  {{ todo }}
</li>
以上只会呈现不完整的待办事项。
==========================================
需要注意的是,如果el-option是通过v-for指令渲染出来的,此时需要为el-option添加key属性,且其值需具有唯一性,比如此例中的item.value。
如果 Select 的绑定值为对象类型,请务必指定 value-key 作为它的唯一性标识。value / v-model	绑定值
==========================================
    mounted() {
      this.list = this.states.map(item => {
        return { value: `value:${item}`, label: `label:${item}` };
      });
    },
==========================================
//------------------------公用方法定义-------------------//
    Vue.prototype.showMessage = function (name, type, msg) {
        var len = arguments.length;
        if (len == 3) {
            switch (arguments[0]) {
                case 'add':
                        this.addAlertShow = true;
                        this.addAlertMsg = arguments[2];
                        this.addAlertType = arguments[1];
                    break;
                case 'edit':
                        this.editAlertShow = true;
                        this.editAlertMsg = arguments[2];
                        this.editAlertType = arguments[1];
                    break;
                case 'maintain':
                     this.maintainAlertShow = true;
                     this.maintainAlertMsg = arguments[2];
                     this.maintainAlertType = arguments[1];
                    break;
            }
        }
        else if (len == 2) {
            if (arguments[0] == 'error') {
                this.$message.error(arguments[1]);
            }
            else if (arguments[0] == 'success') {
                this.$message({
                    showClose: true,
                    message: arguments[1],
                    type: 'success'
                });
            }
        }
    }
==============================================
	html:  v-loading="loading
		  function getLBInfo() {
			this.loading = true;
			this.$http.post('/ToolingModelInfo/GetLBInfo',{ }, { emulateJSON: true }
			).then(function (res) {
				if (res.data.ReturnResult == '0') {
					this.loading = false;
					this.showMessage('success', res.data.ReturnMessage);
				} else {
					this.loading = false;
				   this.showMessage('error', res.data.ReturnMessage);
				}
			}, function () {
					this.loading = false;
				this.$message.error('查询数据失败!');
			});
		}
	vue:   loadding : false
===============================================
this.$nextTick()可以等待dom生成以后再来获取dom对象
this.$nextTick()在页面交互,尤其是从后台获取数据后重新生成dom对象之后的操作有很大的优势,
this.$nextTick(() => {
          console.log(this.$refs['hello'].innerText);
        });
================================================
el-form-item的嵌套
  <el-form-item label="活动时间" required>
    <el-col :span="11">
      <el-form-item prop="date1">
        <el-date-picker type="date" placeholder="选择日期" v-model="ruleForm.date1" style=" 100%;"></el-date-picker>
      </el-form-item>
    </el-col>
    <el-col class="line" :span="2">-</el-col>
    <el-col :span="11">
      <el-form-item prop="date2">
        <el-time-picker placeholder="选择时间" v-model="ruleForm.date2" style=" 100%;"></el-time-picker>
      </el-form-item>
    </el-col>
  </el-form-item>

prop 两个作用
================================================
都不选用change
  <el-form-item label="活动区域" prop="region">
    <el-select v-model="ruleForm.region" placeholder="请选择活动区域">
      <el-option label="区域一" value="shanghai"></el-option>
      <el-option label="区域二" value="beijing"></el-option>
    </el-select>
  </el-form-item>
  
   region: '',

  region: [
	{ required: true, message: '请选择活动区域', trigger: 'change' }
  ],

  date1: [
	{ type: 'date', required: true, message: '请选择日期', trigger: 'change' }
  ],

  resource: [
	{ required: true, message: '请选择活动资源', trigger: 'change' }
  ],
==================================================
<el-form :model="ruleForm" status-icon :rules="rules" ref="ruleForm">

 <el-button @click="resetForm('ruleForm')">重置</el-button>
==================================================
      自定义验证
<el-form :model="ruleForm" status-icon :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
  <el-form-item label="密码" prop="pass">
    <el-input type="password" v-model="ruleForm.pass" autocomplete="off"></el-input>
  </el-form-item>
    <el-form-item label="确认密码" prop="checkPass">
    <el-input type="password" v-model="ruleForm.checkPass" autocomplete="off"></el-input>
  </el-form-item>
	  data() {
      var validatePass = (rule, value, callback) => {
        if (value === '') {
          callback(new Error('请输入密码'));
        } else {
          if (this.ruleForm.checkPass !== '') {
            this.$refs.ruleForm.validateField('checkPass');
          }
          callback();
        }
      };
	  var validatePass2 = (rule, value, callback) => {
        if (value === '') {
          callback(new Error('请再次输入密码'));
        } else if (value !== this.ruleForm.pass) {
          callback(new Error('两次输入密码不一致!'));
        } else {
          callback();
        }
      };
   rules: {
          pass: [
            { validator: validatePass, trigger: 'blur' }
          ],
====================================================
<el-form :model="dynamicValidateForm" ref="dynamicValidateForm" label-width="100px" class="demo-dynamic">
  <el-form-item
    prop="email"
    label="邮箱"
    :rules="[
      { required: true, message: '请输入邮箱地址', trigger: 'blur' },
      { type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }
    ]"
  >
      <el-input v-model="dynamicValidateForm.email"></el-input>
  </el-form-item>
 ==================================================
 含有子表的添加删除
<el-form :model="dynamicValidateForm" ref="dynamicValidateForm" label-width="100px" class="demo-dynamic">
  <el-form-item
    prop="email"
    label="邮箱"
    :rules="[
      { required: true, message: '请输入邮箱地址', trigger: 'blur' },
      { type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }
    ]"
  >
    <el-input v-model="dynamicValidateForm.email"></el-input>
  </el-form-item>
  <el-form-item
    v-for="(domain, index) in dynamicValidateForm.domains"
    :label="'域名' + index"
    :key="domain.key"
    :prop="'domains.' + index + '.value'"
    :rules="{
      required: true, message: '域名不能为空', trigger: 'blur'
    }"
  >
    <el-input v-model="domain.value"></el-input><el-button @click.prevent="removeDomain(domain)">删除</el-button>
  </el-form-item>
  <el-form-item>
    <el-button type="primary" @click="submitForm('dynamicValidateForm')">提交</el-button>
    <el-button @click="addDomain">新增域名</el-button>
    <el-button @click="resetForm('dynamicValidateForm')">重置</el-button>
  </el-form-item>
</el-form>
<script>
  export default {
    data() {
      return {
        dynamicValidateForm: {
          domains: [{
            value: ''
          }],
          email: ''
        }
      };
    },
    methods: {
      submitForm(formName) {
        this.$refs[formName].validate((valid) => {
          if (valid) {
            alert('submit!');
          } else {
            console.log('error submit!!');
            return false;
          }
        });
      },
      resetForm(formName) {
        this.$refs[formName].resetFields();
      },
      removeDomain(item) {
        var index = this.dynamicValidateForm.domains.indexOf(item)
        if (index !== -1) {
          this.dynamicValidateForm.domains.splice(index, 1)
        }
      },
      addDomain() {
        this.dynamicValidateForm.domains.push({
          value: '',
          key: Date.now()
        });
      }
    }
  }
</script>
=======================================================
async type_change(type){
          const d = await this.$http.post('/goods/api/get_goods',{type_id:type})
=======================================================
在vue里,当你对一个不存在的属性或对象直接“.”进行赋值,或者对数组不存在的索引项直接用索引赋值,
从控制台打印可以看到数据变更,但无法使视图更新
=======================================================
 forEach、for in 和for of的区别

forEach  不能使用break return 结束并退出循环

for in 和 for of 可以使用break return;

for in遍历的是数组的索引(即键名),而for of遍历的是数组元素值。

for of遍历的只是数组内的元素,而不包括数组的原型属性method和索引name

所以 for in 更适合遍历对象,for of 适合遍历数组或者类数组
原文地址:https://www.cnblogs.com/ggsddu/p/12418192.html