在vue组件上提交表单时如何获得价值?

时间:2018-03-13 04:10:17

标签: javascript vue.js vuejs2 vue-component vuex

我有两个组件

我的第一个组件是这样的:

class SomeModel extends Model
{
    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'active' => 'integer',
    ];

    // The rest of the model code.

}

在第一个组件上,它将调用表单输入组件

表单输入组件如下:

<template>
    <div>
        ...
            <form-input id="name" name="name" v-model="name">Name</form-input>
        ...
        <button type="submit" class="btn btn-primary" @click="submit">Submit</button>
    </div>
</template>
<script>
    export default {
        data() {
            return {
                name: null
            }
        },
        methods: {
            submit() {
                console.log('submit profile')
                console.log(this.name)
            }
        }
    }
</script>

我使用那样的模式。因此,表单输入组件可以在许多组件中使用

但我的问题是:提交按钮时无法检索值

我尝试这样做,但<template> <div class="form-group"> <label :for="id" class="col-sm-3 control-label"><slot></slot></label> <div class="col-sm-9"> <input :type="type" :name="name" :id="id" class="form-control"> </div> </div> </template> <script> export default { props: { 'id': String, 'name': String, 'type': { type: String, default() { if(this.type == 'number') return 'number' return 'text' } }, } } </script> 的结果是console.log(this.name)

我想在输入数据名称和提交表单时,它会得到名称

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

来自官方文档Form Input Components using Custom Events

  • 知道父级中的v-model与:

    相同
    <child-component
       v-bind:value="something"
       v-on:input="something = $event.target.value">
    

因此,在使用v-model时,您实际上正在“发送”value道具并“期待”input事件。

为了实现这一点,那么,在子组件中执行:

  • 声明道具value
  • <input>更改为:value上面声明的value道具
  • 更改值
  • 时,将<input>更改为向其父级发出input事件

最终模板:

<template>
    <div class="form-group">
        <label :for="id" class="col-sm-3 control-label"><slot></slot></label>
        <div class="col-sm-9">
            <input :type="type" :name="name" :id="id" class="form-control" :value="value" @input="$emit('input', $event.target.value)">
        </div>
    </div>
</template>
<script>
    export default {
        props: {
            'id': String,
            'name': String,
            'type': {
                type: String,
                default() {
                    if(this.type == 'number')
                        return 'number'
                    return 'text'
                }
            },
            'value': String,
        }
    }
</script>