vue 处理表单数据

基本用法

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>

</head>
<body>
    <div id="app">
    	<!--prevent 阻止默认事件-->
        <form action="/login" @submit.prevent="submit">
            用户名: <input type="text" v-model="username"> <br>
            密码: <input type="password" v-model="password"> <br>
            性别: <input type="radio" id="male" name="sex" v-model="sex" value="male"> <label for="male"></label>
            <input type="radio" id="female" name="sex" v-model="hobby" value="female"> <label for="female"></label> <br>
            爱好: <input type="checkbox" id="basket" v-model="hobby" value="basket"> <label for="basket"> 篮球 </label>
            <input type="checkbox" id="foot" v-model="hobby" value="foot"> <label for="foot">足球</label>
            <input type="checkbox" id="pp" v-model="hobby" value="pp"> <label for="pp"> 乒乓球 </label> <br>
            城市: <select name="" id="city" v-model="city">
                    <option value="未选择">未选择</option>
                    <option value="sh">sh</option>
                    <option value="wh">wh</option>
                    <option value="gd">gd</option>
        </select> <br>

            <textarea name="" id="text" cols="30" rows="10" v-model="desc"></textarea> <br>
            <input type="submit">
        </form>

    </div>
    <script src="../js/vue.js"></script>
    <script>
        let vm = new Vue({
            el:'#app',
            data:{
                username: '',
                password:'',
                sex: 'male',
                hobby:[],
                city:'gd',
                desc:''
            },
            methods:{
                submit(){
                    console.log(this.username, this.password, this.sex, this.hobby, this.city, this.desc)
                }
            },

        })
    </script>
</body>
</html>

在这里插入图片描述

表单修饰符

  • .number 转换为数值

    • 注意点:
    • 当开始输入非数字的字符串时,因为Vue无法将字符串转换成数值
    • 所以属性值将实时更新成相同的字符串。即使后面输入数字,也将被视作字符串。
  • .trim 自动过滤用户输入的首尾空白字符

    • 只能去掉首尾的 不能去除中间的空格
  • .lazy 将input事件切换成change事件

    • .lazy 修饰符延迟了同步更新属性值的时机。即将原本绑定在 input 事件的同步逻辑转变为绑定在 change 事件上
      在失去焦点 或者 按下回车键时才更新
    <!-- 自动将用户的输入值转为数值类型 -->
    <input v-model.number="age" type="number">
    
    <!--自动过滤用户输入的首尾空白字符   -->
    <input v-model.trim="msg">
    
    <!-- 在“change”时而非“input”时更新 -->
    <input v-model.lazy="msg" >
    
<think> 我们正在讨论Vue中获取表单数据的方法。Vue提供了多种方式来处理表单输入,包括v-model指令、ref引用等。 常见的表单元素有input、textarea、select等,我们可以通过v-model实现双向数据绑定,或者通过ref在需要时获取元素的值。 方法一:使用v-model(响应式数据绑定) 在Vue组件中,我们可以在表单元素上使用v-model指令,将其与一个数据属性绑定。当用户输入时,数据属性会自动更新。 方法二:使用ref(非响应式获取) 通过ref属性给表单元素注册引用,然后在需要的时候通过this.$refs访问DOM元素或组件实例,从而获取值。 方法三:使用事件处理(如@input, @change) 可以在表单元素上监听输入事件,通过事件对象event.target.value获取当前值。 下面给出示例代码: 示例1:使用v-model <template> <input v-model="username" type="text"> <button @click="submit">提交</button> </template> <script> export default { data() { return { username: '' } }, methods: { submit() { console.log('用户名:', this.username); } } } </script> 示例2:使用ref <template> <input ref="usernameInput" type="text"> <button @click="submit">提交</button> </template> <script> export default { methods: { submit() { const username = this.$refs.usernameInput.value; console.log('用户名:', username); } } } </script> 示例3:使用事件处理 <template> <input type="text" @input="onInput"> <button @click="submit">提交</button> </template> <script> export default { data() { return { username: '' } }, methods: { onInput(event) { this.username = event.target.value; }, submit() { console.log('用户名:', this.username); } } } </script> 注意事项: - v-model在内部为不同的输入元素使用不同的property并抛出不同的事件: text和textarea元素使用value属性和input事件; checkbox和radio使用checked属性和change事件; select字段将value作为prop并将change作为事件。 - 对于复杂表单,可以使用多个v-model绑定,或者使用对象来组织数据。 在Vue3中,v-model也可以用于自定义组件,并且支持多个v-model绑定。 根据以上内容,生成相关问题: §§相关问题§§ 1. Vue中v-model指令在复选框(checkbox)上的使用有何特殊之处? 2. 如何在Vue3中实现自定义组件的v-model双向绑定? 3. 使用ref获取表单数据与使用v-model相比有哪些优缺点? 4. Vue中如何防止表单提交导致的页面刷新? 5. 处理表单验证时,Vue有哪些常用库或方法? </think> ### Vue 获取表单数据的常用方法 在 Vue 中获取表单数据主要有以下几种方式: #### 1. **`v-model` 双向绑定 (推荐方式)** ```vue <template> <form @submit.prevent="handleSubmit"> <input v-model="formData.name" type="text" placeholder="姓名"> <input v-model.number="formData.age" type="number" placeholder="年龄"> <textarea v-model="formData.message"></textarea> <button type="submit">提交</button> </form> </template> <script> export default { data() { return { formData: { name: '', age: null, message: '' } } }, methods: { handleSubmit() { console.log('表单数据:', this.formData) // 发送到API: axios.post('/api/submit', this.formData) } } } </script> ``` **特点**: - 自动同步表单输入数据对象 - 支持修饰符:`.trim`(去空格)、`.number`(转数字)、`.lazy`(失焦更新) #### 2. **`ref` 引用 DOM 元素** ```vue <template> <form ref="myForm" @submit.prevent="getFormData"> <input name="email" type="email"> </form> </template> <script> export default { methods: { getFormData() { const form = this.$refs.myForm console.log('邮箱:', form.email.value) // 或遍历所有元素 const data = {} Array.from(form.elements).forEach(el => { if (el.name) data[el.name] = el.value }) } } } </script> ``` #### 3. **表单提交事件处理** ```vue <template> <form @submit.prevent="handleSubmit"> <input type="text" name="username"> <button>提交</button> </form> </template> <script> export default { methods: { handleSubmit(event) { const formData = new FormData(event.target) console.log('用户名:', formData.get('username')) // 转对象格式 const data = Object.fromEntries(formData.entries()) } } } </script> ``` #### 4. **第三方库 (复杂表单推荐)** - **VeeValidate**:表单验证 + 数据收集 - **FormKit**:表单生成框架 - **Vuelidate**:轻量级验证 #### 注意事项 1. 使用 `.prevent` 修饰符阻止表单默认提交刷新页面 2. 单选/复选框需绑定到数组: ```vue <input v-model="selected" type="checkbox" value="A"> ``` 3. 动态表单字段使用 `:name` 绑定: ```vue <input v-for="(item, i) in items" :key="i" v-model="item.value" :name="'item_' + i"> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值