vue & watch props
vue & watch props
bug

OK

    watch: {
        // props
        // chatObj: () => {
        //     // bug
        //     log(`this.chatObj =`, JSON.stringify(this.chatObj, null, 4));
        // },
        chatObj: (newValue, oldValue) => {
            // OK
            log(`old chatObj =`, JSON.stringify(oldValue, null, 4));
            log(`new chatObj =`, JSON.stringify(newValue, null, 4));
        },
    },
watch & args
new Vue({
  el: '#app',
  data: {
    text: 'Hello'
  },
  components: {
    'child' : {
      template: `<p>{{ myprop }}</p>`,
      props: ['myprop'],
      watch: {
      	myprop: function(newVal, oldVal) { // watch it
          console.log('Prop changed: ', newVal, ' | was: ', oldVal)
        }
      }
    }
  }
});

    watch: {
        // props
        chatObj() {
            // bug
            log(`this.chatObj =`, JSON.stringify(this.chatObj, null, 4));
        },
    },
https://stackoverflow.com/questions/44584292/vuejs-2-0-how-to-listen-for-props-changes
https://forum.vuejs.org/t/cant-watch-component-props-as-object/28005
watch deep
deep: true,
const something = {
  template: '<div><pre>{{ updateData }}</pre></div>',
  props: {
    updateData: Object,
  },
  watch: {
    updateData: {
      handler (val) {
        console.log('watch', val.message);
      },
      deep: true,
    },
  },
};
https://codepen.io/xgqfrms/pen/MNmZNo

vue & watch & props
v-if & loading 异步加载数据,然后渲染组件
https://github.com/xgqfrms/vue/issues/86

demo
parent

child
<template>
  <el-dialog
    title="表单编辑"
    class="form-modal-box"
    :before-close="closeForm"
    :visible.sync="visible">
    <el-form
      :rules="rules"
      size="small"
      :model="form">
      <el-form-item
        label="投放链接"
        prop="putLink"
        class="required-symbol"
        :label-width="formLabelWidth">
        <el-input
          class="required-input"
          v-model="form.putLink"
          @input="inputChange"
          @change="inputChange"
          autocomplete="off">
        </el-input>
      </el-form-item>
      <el-form-item
        label="主标题"
        class="required-symbol"
        prop="title"
        :label-width="formLabelWidth">
        <el-input
          class="required-input"
          v-model="form.title"
          autocomplete="off">
        </el-input>
        <el-alert
          class="required-input"
          v-if="titleLengthLimit"
          :closable="false"
          title="主标题: 长度 8个字以内"
          type="warning">
        </el-alert>
      </el-form-item>
      <el-form-item
        label="副标题"
        class="required-symbol"
        prop="subTitle"
        :label-width="formLabelWidth">
        <el-input
          class="required-input"
          v-model="form.subTitle"
          autocomplete="off">
        </el-input>
        <el-alert
          class="required-input"
          v-if="subTitleLengthLimit"
          :closable="false"
          title="副标题: 长度 13个字以内"
          type="warning">
        </el-alert>
      </el-form-item>
      <!-- <el-form-item
        label="投放时间"
        class="required-symbol"
        required
        :label-width="formLabelWidth">
        <el-date-picker
          style="width: 100%"
          class="required-input"
          @change="datePickerHandler"
          v-model="form.putTime"
          :clearable="false"
          format="yyyy-MM-dd HH:mm:ss"
          value-format="yyyy-MM-dd HH:mm:ss"
          type="datetimerange"
          range-separator="至"
          start-placeholder="开始日期"
          end-placeholder="结束日期">
        </el-date-picker>
        <el-alert
          class="required-input"
          v-if="dateEmpty"
          :closable="false"
          title="投放日期不可为空"
          type="warning">
        </el-alert>
      </el-form-item> -->
    </el-form>
    <div
      slot="footer"
      class="dialog-footer">
      <el-button
        size="small"
        @click="closeForm">
        取消
      </el-button>
      <el-button
        @click="saveForm"
        size="small"
        type="primary">
        确定
      </el-button>
    </div>
  </el-dialog>
</template>
<script>
  const log = console.log;
  const tomorrow = new Date().getTime() + 3600 * 24 * 1000;
  export default {
    name: "FormModal",
    props: {
      dialogFormData: {
        type: Object,
        default: () => {},
      },
      dialogFormVisible: {
        type: Boolean,
        default: () => false,
      },
      isAdd: {
        type: Boolean,
        default: () => false,
      },
    },
    data() {
      return {
        form: {
          putLink: "",
          title: "",
          subTitle: "",
          putTime: ["", ""],
        },
        formLabelWidth: "80px",
        visible: false,
        rules: {
          putLink: [
            {
              required: true,
              message: '请输入投放链接',
              trigger: ['blur', 'change'],
            },
          ],
          title: [
            {
              required: true,
              message: '请输入主标题',
              trigger: ['blur', 'change'],
            },
            // {
            //   min: 1,
            //   max: 8,
            //   message: '主标题长度在 8 个字以内',
            //   trigger: ['blur', 'change'],
            // },
          ],
          subTitle: [
            {
              required: true,
              message: '请输入副标题',
              trigger: ['blur', 'change'],
            },
            // {
            //   min: 1,
            //   max: 13,
            //   message: '副标题长度在 13 个字以内',
            //   trigger: ['blur', 'change'],
            // },
          ],
          startTime: [
            {
              type: 'date',
              required: true,
              message: '请输入投放时间范围',
              trigger: ['blur', 'change'],
            },
          ],
          endTime: [
            {
              type: 'date',
              required: true,
              message: '请输入投放时间范围',
              trigger: ['blur', 'change'],
            },
          ],
          putTime: [
            {
              type: 'datetimerange',
              required: true,
              message: '请输入投放时间范围',
              trigger: ['blur', 'change'],
            },
          ],
        },
        isValidated: true,
      };
    },
    methods: {
      inputChange(value = ``) {
        this.form.putLink = value.trim();
      },
      closeForm() {
        this.$emit(`close-put-item`);
      },
      timeStringToTimestamp(str) {
        return new Date(str).getTime();
      },
      saveForm() {
        let {
          putId,
          putLink,
          title,
          subTitle,
          putTime,
        } = this.form;
        const flag = this.isAdd;
        let data = {
          putLink,
          title,
          subTitle,
          // startTime: this.timeStringToTimestamp(putTime[0]),
          // endTime: this.timeStringToTimestamp(putTime[1]),
        };
        if(!flag) {
          data = {
            id: putId,
            ...data,
          };
        }
        if(putLink && title && subTitle && putTime[0]) {
          this.$emit(`save-put-item`, data, flag);
        } else {
          this.$message({
            type: 'error',
            message: '必填字段不可为空!'
          });
        }
      },
      datePickerHandler(values = ``) {
        // log(`date values`, values[0], values[1]);
        this.form.putTime = [values[0], values[1]];
      },
    },
    computed: {
      titleLengthLimit() {
        const {
          title,
        } = this.form;
        return title.length > 8 ? true : false;
      },
      subTitleLengthLimit() {
        const {
          subTitle,
        } = this.form;
        return subTitle.length > 8 ? true : false;
      },
      dateEmpty() {
        const {
          putTime,
        } = this.form;
        return !putTime[0] ? true : false;
      },
    },
    mounted() {
      this.visible = this.dialogFormVisible;
    },
    watch: {
      isAdd(newProp, oldProp) {
        log(`\nthis.isAdd`, newProp, oldProp);
        // this.isAdd = newProp;
      },
      dialogFormVisible(newProp, oldProp){
        this.visible = newProp;
        this.form = {
          putLink: "",
          title: "",
          subTitle: "",
          putTime: [moment().format('YYYY-MM-DD HH:mm:ss'), moment(tomorrow).format('YYYY-MM-DD HH:mm:ss')],
        };
      },
      dialogFormData(newProp, oldProp){
        if (this.isAdd) {
          this.form = {
            putLink: "",
            title: "",
            subTitle: "",
            putTime: [moment().format('YYYY-MM-DD HH:mm:ss'), moment(tomorrow).format('YYYY-MM-DD HH:mm:ss')],
          };
        } else {
          this.form = newProp;
        }
      },
    },
    beforeDestroy() {
      log(`before destroy`);
    },
    destroyed() {
      log(`destroyed`);
    },
  }
</script>
<style lang="less">
  @import url("./form-modal.less");
</style>
modal

parent
    <!-- modal -->
    <FormModal
      :dialogFormVisible="dialogFormVisible"
      :isAdd="isAdd"
      :dialogFormData="dialogFormData"
      @close-put-item="closePutItem"
      @save-put-item="savePutItem"
    />
    methods: {
      openPutItem() {
        this.isAdd = true;
        this.dialogFormData = this.initFormData;
        this.dialogFormVisible = true;
      },
      closePutItem() {
        this.dialogFormVisible = false;
      },
      savePutItem(data = {}, flag = false) {
        this.closePutItem();
        this.updateData(data, flag);
      },
  }
child
      closeForm() {
        this.$emit(`close-put-item`);
      },
refs
xgqfrms 2012-2020
www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!
vue & watch props的更多相关文章
- [转]Vue中用props给data赋初始值遇到的问题解决
		原文地址:https://segmentfault.com/a/1190000017149162 2018-11-28更:文章发布后因为存在理解错误,经@Kim09AI同学提醒后做了调整,在此深表感谢 ... 
- Vue中用props给data赋初始值遇到的问题解决
		Vue中用props给data赋初始值遇到的问题解决 更新时间:2018年11月27日 10:09:14 作者:yuyongyu 我要评论 这篇文章主要介绍了Vue中用props给dat ... 
- Vue computed props pass params
		Vue computed props pass params vue 计算属性传参数 // 计算 spreaderAlias spreaderAlias () { console.log('this. ... 
- vue & components & props & methods & callback
		vue & components & props & methods & callback demo solution 1 & props & data ... 
- vue & modal props & form data update bug
		vue & modal props & form data update bug OK <div> <BindModal :dialogBindVisible=&qu ... 
- vue之props父子组件之间的谈话
		眨眼就来杭州两年了,时间真快. 我们今天来说说vue的一个api---->props 首先我们先看看一个例子,是我一个项目中写的. 看到这个:有木有一点懂了.要是没懂,继续往下看 这里我们用到了 ... 
- vue的props和$attrs
		过去我们在vue的父子组件传值的时候,我们先需要的子组件上用props注册一些属性: <template> <div> props:{{name}},{{age}} 或者 {{ ... 
- vue学习--Props
		Props: props用以从父组件接收数据: 使用: Vue.component('child',{ ... 
- vue使用props动态传值给子组件里的函数用,每次更新,呼叫函数
		父组件 <template> <div id="app"> <div>详情内容</div> <button v-on:clic ... 
随机推荐
- 前置时间(Lead Time),也称前置期、备货周期
			https://wiki.mbalib.com/wiki/前导时间 什么是前导时间 所谓的前导时间(leading time),就是产品从设计,到生产.物流.销售的过程. BELLWETHER:&qu ... 
- (014)每日SQL学习:oracle下lag和lead分析函数
			/*语法*/ lag(exp_str,offset,defval) over() Lead(exp_str,offset,defval) over() --exp_str要取的列 --offset取偏 ... 
- 【题解】 CF767E Change-free
			洛谷链接 这个题翻译忘了输入,我看的英语原文...... 首先,这是一道贪心题 我的大致方法:pair+堆优 题目分析: 从第一天开始,到最后一天,每天可以选择找钱或者不找钱. 如果不找钱,则零钱数m ... 
- 大型面试现场:一条update sql执行都经历什么?
			导读 Hi,大家好!我是白日梦!本文是MySQL专题的第 24 篇. 今天我要跟你分享的MySQL话题是:"从一条update sql执行都经历什么开始,发散开一系列的问题,看看你能抗到第几 ... 
- Linux 输入输出重定向, &>file, 2>&1, 1>&2
			Linux 输入输出重定向, &>file, 2>&1, 1>&2 一.1和2在Linux中代表什么 1.1 输出重定向 1.2 输入重定向 1.3 绑定重定 ... 
- spark-submit提交spark任务的具体参数配置说明
			spark-submit提交spark任务的具体参数配置说明 1.spark提交任务常见的两种模式 2.提交任务时的几个重要参数 3.参数说明 3.1 executor_cores*num_execu ... 
- 大数据体系概览Spark、Spark核心原理、架构原理、Spark特点
			大数据体系概览Spark.Spark核心原理.架构原理.Spark特点 大数据体系概览(Spark的地位) 什么是Spark? Spark整体架构 Spark的特点 Spark核心原理 Spark架构 ... 
- Java 复习整理day06
			Java api 章节除了一下列的常用类别的用时候查文档 1 package com.it.demo01_api; 2 3 import java.util.Scanner; 4 5 /* 6 案例: ... 
- linux(3) 处理目录的常用命令
			目录命令总览 ls(英文全拼:list files): 列出目录及文件名 cd(英文全拼:change directory):切换目录 pwd(英文全拼:print work directory):显 ... 
- 浅谈Winform控件开发(一):使用GDI+美化基础窗口
			写在前面: 本系列随笔将作为我对于winform控件开发的心得总结,方便对一些读者在GDI+.winform等技术方面进行一个入门级的讲解,抛砖引玉. 别问为什么不用WPF,为什么不用QT.问就是懒, ... 
