【Vue 尚硅谷学习笔记(六)】V-model 表单数据获取、过滤器

168 阅读2分钟

1. 表单数据收集

表单数据可以通过ajax进行获取,具体方法可以查看 Ajax基础、jquery中的ajax与axios

v-model也可以通过双向数据绑定进行表单数据收集,表单具体类别包含如下内容

  • text/textarea
  • checkbox
  • radio
  • select

v-model的三个修饰符:

  • lazy:失去焦点再收集数据
  • number:输入字符串转为有效的数字
  • trim:输入首尾空格过滤

1.1 text

<input type="text" v-model.trim="userInfo.account"/> v-model收集的是value值,用户输入的就是value值。

1.2 checkbox

<input type="checkbox" v-model="" value=""/>

  1. 没有配置input的value属性,那么收集的就是checked(勾选 or 未勾选,是布尔值)

  2. 配置input的value属性:

  • v-model的初始值是非数组,那么收集的就是checked(勾选 or 未勾选,是布尔值)
  • v-model的初始值是数组,那么收集的的就是value组成的数组!!!下面的代码中hobby收集的就是被勾选的value值数组, 比如 ['study','music']
爱好:
学习<input type="checkbox" v-model="hobby" value="study"/>
听音乐<input type="checkbox" v-model="hobby" value="music"/>
吃东西<input type="checkbox" v-model="hobby" value="eat"/>

data{
    hobby: [], 
}

1.3 radio

<input type="radio"/>,v-model收集的是value值,且要给标签配置value值。

性别: 
男<input type="radio" name="sex" v-model="userInfo.sex" value="male"> 
女<input type="radio" name="sex" v-model="userInfo.sex" value="female">

1.4 示例

<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8" />
  <title>收集表单数据</title>
  <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.js"></script>
</head>

<body>
  <!-- 准备好一个容器-->
  <div id="root">
   <!--@submit.prevent 阻止表单提交的默认跳转行为-->
    <form @submit.prevent="demo">
      账号:<input type="text" v-model.trim="userInfo.account"> <br /><br />
      密码:<input type="password" v-model="userInfo.password"> <br /><br />
      年龄:<input type="number" v-model.number="userInfo.age"> <br /><br />
      性别:
      男<input type="radio" name="sex" v-model="userInfo.sex" value="male"><input type="radio" name="sex" v-model="userInfo.sex" value="female"> <br /><br />
      爱好:
      学习<input type="checkbox" v-model="userInfo.hobby" value="study">
      打游戏<input type="checkbox" v-model="userInfo.hobby" value="game">
      吃饭<input type="checkbox" v-model="userInfo.hobby" value="eat">
      <br /><br />
      所属校区
      <select v-model="userInfo.city">
        <option value="">请选择校区</option>
        <option value="beijing">北京</option>
        <option value="shanghai">上海</option>
        <option value="shenzhen">深圳</option>
        <option value="wuhan">武汉</option>
      </select>
      <br /><br />
      其他信息:
      <textarea v-model.lazy="userInfo.other"></textarea> <br /><br />
      <input type="checkbox" v-model="userInfo.agree">阅读并接受<a href="http://www.atguigu.com">《用户协议》</a>
      <button>提交</button>
    </form>
  </div>
</body>

<script type="text/javascript">
  Vue.config.productionTip = false

  new Vue({
    el: '#root',
    data: {
      userInfo: {
        account: '',
        password: '',
        age: 18,
        sex: 'female',
        hobby: [],
        city: 'beijing',
        other: '',
        agree: ''
      }
    },
    methods: {
      demo() {
        console.log(JSON.stringify(this.userInfo))
      }
    }
  })
</script>

</html>

2. 过滤器

过滤器不是一个必须要用的东西,可以使用计算属性、监听属性等来实现相应功能。

2.1 moment.js

moment.js 比较大,day.js功能类似,但是一个比较小的库

2.2 过滤器介绍

定义:对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理)。

语法:

  1. 注册过滤器:Vue.filter(name,callback)new Vue{filters:{}}
  2. 使用过滤器:{{ xxx | 过滤器名}}v-bind:属性 = "xxx | 过滤器名"

备注:

  1. 过滤器也可以接收额外参数、多个过滤器也可以串联
  2. 并没有改变原本的数据, 是产生新的对应的数据

全局过滤器

Vue.filter(filterName, function(value[,arg1,arg2,...]){
  // 进行一定的数据处理
  return newValue
})

局部过滤器

new Vue{
    filters:{
        filterName(value){
            return newValue
        }
    }
}

2.3 过滤器使用

<body>
    <div id="demo">
        <h2>显示格式化的日期时间</h2>
        <p>{{date}}</p> 
        <p>完整版:{{date | dateString}}</p>
        <p>年月日:{{date | dateString('YYYY-MM-DD')}}</p>
        <p>时分秒:{{date | dateString('HH:mm:ss')}}</p>
    </div>

    <script src="../js/vue.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/moment.js/2.29.1/moment.js"></script>
    <script>
        Vue.filter('dateString', function(value, format='YYYY-MM-DD HH:mm:ss'){
            return moment(value).format(format);
        });

        new Vue({
            el: '#demo',
            data: {
                date: new Date()
            }
        })
    </script>
</body>