【问题标题】:vue.js conflicts with .datepicker and removes date value after changing next v-model inputvue.js 与 .datepicker 冲突并在更改下一个 v-model 输入后删除日期值
【发布时间】:2021-07-03 14:00:18
【问题描述】:

我有一个用 laravel 和 vue2 实现的表单,它有一些我正在使用 datepicker 插件的日期字段。但问题是,当我输入下一个(或任何其他)输入时,日期字段的值变为空。我尝试了很多方法并寻找了很多问题,但没有任何帮助。

See this Short Video for better understanding of the problem

输入

<div class="form-group">
    <label class="col-form-label col-form-label-sm" for="memo_date">Memo Date</label>
    <input v-model="form.memo_date" class="form-control demoDate2" id="memo_date" name="memo_date" type="text" placeholder="DD-MM-YYYY" autocomplete="off" value="{{old('memo_date')}}">
    <span class="text-danger" v-if="errors.memo_date">@{{ errors.memo_date[0] }}</span>
</div>

<div class="form-group">
    <label class="col-form-label col-form-label-sm" for="from_date">From Date</label>
    <input class="form-control demoDate2" v-model="form.from_date" @keyup.prevent="getDuration" id="from_date" name="from_date" type="text" placeholder="DD-MM-YYYY" autocomplete="off">
    <span class="text-danger" v-if="errors.from_date">@{{ errors.from_date[0] }}</span>
</div>

<div class="form-group">
    <label class="col-form-label col-form-label-sm" for="to_date">To Date</label>
    <input class="form-control demoDate2" v-model="form.to_date" @keyup.prevent="getDuration" id="to_date" name="to_date" type="text" placeholder="DD-MM-YYYY" autocomplete="off">
    <span class="text-danger" v-if="errors.to_date">@{{ errors.to_date[0] }}</span>
</div>

<div class="form-group">
    <label class="col-form-label" for="memo_no">Memo No</label>
    <input class="form-control" v-model="form.memo_no" id="memo_no" type="text" name="memo_no" value="{{ old('memo_no') }}">
    <span class="text-danger" v-if="errors.memo_no">@{{ errors.memo_no[0] }}</span>
</div>

数据和挂载函数

data: {
   ...
   ...
    form: {
        attachment:'',
        memo_no:'',
        memo_date:'',
        from_date:'',
        to_date:'',
        duration:'',
        description:'',
        employees_ids:[],
    },
    errors:[]
},

mounted: function (){
    // datepicker
    $('.demoDate2').datepicker({
        format: "dd-mm-yyyy",
        autoclose: true,
        todayHighlight: true,
        orientation: "bottom auto"
    });
}

附加说明:我在mounted() 中使用了change() 事件,以在使用日期选择器/键盘添加日期值并触发它时发出警报。 但是当值被移除时,事件不会触发!

我已经尝试过This 以及更多,但没有任何帮助。请帮我找出问题。任何帮助表示赞赏。

【问题讨论】:

  • @blackgreen 用 Vue 数据更新问题
  • 可能是什么原因导致.datepicker() 在三个.demoDate2 字段上重新初始化?例如,mounted 函数被重新调用。
  • datepicker 不工作,除非在mounted() 中使用。为什么重新初始化会清空日期字段值?

标签: jquery laravel vuejs2 datepicker


【解决方案1】:

我认为你必须绑定 datepicker onSelect 事件来更新当前模型。

你可以看下面的例子。

<div class="form-group">
    <label class="col-form-label col-form-label-sm" for="memo_date">Memo Date</label>
    <input v-model="form.memo_date" class="form-control demoDate2" id="memo_date" name="memo_date" type="text" placeholder="DD-MM-YYYY" autocomplete="off" value="{{old('memo_date')}}">
    <span class="text-danger" v-if="errors.memo_date">@{{ errors.memo_date[0] }}</span>
</div>

================================================ ====================================

 data: {
       ...
       ...
        form: {
            attachment:'',
            memo_no:'',
            memo_date:'',
            from_date:'',
            to_date:'',
            duration:'',
            description:'',
            employees_ids:[],
        },
        errors:[]
    },
    
    mounted: function (){
        var self = this;
        // datepicker
        $('.demoDate2').datepicker({
            format: "dd-mm-yyyy",
            autoclose: true,
            todayHighlight: true,
            orientation: "bottom auto",
            onSelect:function(selectedDate, datePicker) {            
                  self.form.memo_date = selectedDate;
            }
        });
    }

【讨论】:

  • 仍在删除日期... >_
  • 请注意,日期值是完美添加的,但是当我更改任何其他字段时,日期值会立即被删除!!
【解决方案2】:

问题可能是几件事:

  1. 您正在使用 value 和 v-model。使用 v-model 时不要使用 value,当您收到错误响应时设置默认值(如果您使用 ajax 发布)或者如果您使用默认 post 则使用 prop 设置它
  2. jQuery是一个DOM操作库,而vue使用shadow dom。它们不能很好地协同工作,尤其是在 jQuery 设置输入值时。

如果您使用默认表单发布输入,请创建包含值的隐藏输入并在日期选择器更改时设置值。 如果您使用 ajax 发布此表单,则不需要隐藏输入,因为您在 vue 数据对象中拥有所需的所有数据。

<div class="form-group">
    <label class="col-form-label col-form-label-sm" for="memo_date">Memo Date</label>
    <input type="hidden" v-model="form.memo_date" name="memo_date">
    <input class="form-control demoDate2" id="memo_date" type="text" placeholder="DD-MM-YYYY" autocomplete="off" value="@{{ form.memo_date }}">
    <span class="text-danger" v-if="errors.memo_date">@{{ errors.memo_date[0] }}</span>
</div>

<div class="form-group">
    <label class="col-form-label col-form-label-sm" for="from_date">From Date</label>
    <input type="hidden" v-model="form.from_date" name="from_date">
    <input class="form-control demoDate2" @keyup.prevent="getDuration" id="from_date" type="text" placeholder="DD-MM-YYYY" autocomplete="off">
    <span class="text-danger" v-if="errors.from_date">@{{ errors.from_date[0] }}</span>
</div>

<div class="form-group">
    <label class="col-form-label col-form-label-sm" for="to_date">To Date</label>
    <input type="hidden" v-model="form.to_date">
    <input class="form-control demoDate2" @keyup.prevent="getDuration" id="to_date" name="to_date" type="text" placeholder="DD-MM-YYYY" autocomplete="off">
    <span class="text-danger" v-if="errors.to_date">@{{ errors.to_date[0] }}</span>
</div>

<div class="form-group">
    <label class="col-form-label" for="memo_no">Memo No</label>
    <input class="form-control" v-model="form.memo_no" id="memo_no" type="text" name="memo_no">
    <span class="text-danger" v-if="errors.memo_no">@{{ errors.memo_no[0] }}</span>
</div>
    data: {
       ...
       ...
        form: {
            attachment:'',
            memo_no:'',
            memo_date:'',
            from_date:'',
            to_date:'',
            duration:'',
            description:'',
            employees_ids:[],
        },
        errors:[]
    },
    
    mounted: function (){
        $('.demoDate2').datepicker({
            format: "dd-mm-yyyy",
            autoclose: true,
            todayHighlight: true,
            orientation: "bottom auto",
            onSelect: (selectedDate, datePicker) => {
                // No need to bind this when using arrow functions.
                // You may need to find out which datepicker is changing via the event.target or datePicker to do a switch or if else to set the correct date.
                this.form.memo_date = selectedDate;
            }
        });
    }

【讨论】:

  • 抱歉来晚了,我很忙。立即查看
  • 检查并删除了不必要的值,仍然删除了需要解决问题的日期。像你说的那样使用 datepicker 使它不起作用
  • @Psycho 我可能会放弃 jquery 选项并使用它的 vuejs 端口。 npmjs.com/package/vuejs-datepicker
猜你喜欢
  • 2017-10-26
  • 2019-05-11
  • 1970-01-01
  • 2018-05-12
  • 1970-01-01
  • 2017-03-30
  • 2020-04-09
  • 2017-10-10
  • 2015-11-02
相关资源
最近更新 更多