v-model基本用法

输入框

  1. <template>
  2. <div>
  3. <input v-model="message" /> //绑定
  4. {{message}}
  5. <button @click="message='frank'">set message</button> //点击修改值为frank
  6. </div>
  7. </template>
  8. <script>
  9. export default{
  10. name:'app',
  11. data(){
  12. return{
  13. message:'hi'
  14. }
  15. },
  16. components:{}
  17. }
  18. </script>

复选框

  1. <template>
  2. <div>
  3. <label>
  4. <input type="checkbox" v-model="x" :value="1"/> //绑定,这里:value后面是数字,所以有:
  5. <span>抽烟</span> //显示
  6. </label>
  7. <label>
  8. <input type="checkbox" v-model="x" :value="2"/> //绑定
  9. <span>喝酒</span> //显示
  10. </label>
  11. <label>
  12. <input type="checkbox" v-model="x" :value="3"/> //绑定
  13. <span>烫头</span> //显示
  14. </label>
  15. </div>
  16. </template>
  17. <script>
  18. export default{
  19. name:'app',
  20. data(){
  21. return {
  22. x:[] //数据,注意是数组
  23. }
  24. },
  25. components:{}
  26. }
  27. </script>

radio,虽然不加name也可以只选一个,但还是加一下比较好

  1. <template>
  2. <div>
  3. <label>
  4. <input type="radio" name="radio1" v-model="x" :value="1"/> //绑定,这里:value后面是数字,所以有:
  5. <span>抽烟</span> //显示
  6. </label>
  7. <label>
  8. <input type="radio" name="radio1" v-model="x" :value="2"/> //绑定
  9. <span>喝酒</span> //显示
  10. </label>
  11. <label>
  12. <input type="radio" name="radio1" v-model="x" :value="3"/> //绑定
  13. <span>烫头</span> //显示
  14. </label>
  15. </div>
  16. </template>
  17. <script>
  18. export default{
  19. name:'app',
  20. data(){
  21. return {
  22. x:'' //数据
  23. }
  24. },
  25. components:{}
  26. }
  27. </script>

select,选择一个option,x就会显示1或2或3

  1. <template>
  2. <div>
  3. {{x}}
  4. <select mutiple v-model="x"> //mutiple是可以同时多选
  5. <option value>-</option>
  6. <option v-for="item in array" :value="item.value" :key="item.value">{{item.text}}</option>
  7. </select>
  8. </div>
  9. </template>
  10. <script>
  11. export default{
  12. name:'app',
  13. data(){
  14. return {
  15. array:[
  16. {text:'抽烟',value:1},
  17. {text:'喝酒',value:2},
  18. {text:'烫头',value:3}
  19. ],
  20. x:[] //多选,所以这里是[],不然就是个空字符串即可
  21. }
  22. },
  23. components:{}
  24. }
  25. </script>

form,加了

标签和button,输入框在焦点时,按回车就提交了

  1. <template>
  2. <div>
  3. <form>//加这个标签
  4. <label>
  5. <span>用户名</span>
  6. <input type="text" v-model="user.username" />
  7. </label>
  8. <label>
  9. <span>密码</span>
  10. <input type="password" v-model="user.password" />
  11. </label>
  12. <button>登录</button>//加这个标签
  13. </form>
  14. </div>
  15. </template>

如果想不刷新,只保存。监听submit事件,触发自己的方法

  1. <template>
  2. <div>
  3. <form @submit.prevent="onSubmit">//加这个,prevent是阻止动作
  4. <label>
  5. <span>用户名</span>
  6. <input type="text" v-model="user.username" />
  7. </label>
  8. <label>
  9. <span>密码</span>
  10. <input type="password" v-model="user.password" />
  11. </label>
  12. <button>登录</button>
  13. </form>
  14. </div>
  15. </template>
  16. <script>
  17. export default {
  18. name:'App',
  19. data(){
  20. return{
  21. user:{
  22. username:"",
  23. password:""
  24. }
  25. }
  26. },
  27. methods:{
  28. onSubmit(){
  29. console.log(this.user) //打印出user
  30. }
  31. }
  32. }
  33. </script>

三个修饰符,做辅助

.lazy修饰符

  1. v-model.lazy="user.username"

这样输入时,就不会同步,离开输入框焦点时才会

.number

只需要数字部分时,用这个
例如s0123d,同步出来的就是123

  1. v-model.model="user.username"

.trim

去掉前后空格

  1. v-model.trim="user.username"

v-model详解

v-model相当于代替了这个
App.vue

  1. <input type="text" :value="user.username" @input="user.username = $event.target.value" />

被v-model代替的例子,自己封装一个input:
MyInput.vue

  1. <template>
  2. <div>
  3. <input :value="value" @input="oninput" /> //这里的oninput对应methods中的oninput
  4. </div>
  5. </template>
  6. <script>
  7. export default{
  8. name:'MyInput',
  9. props:{
  10. value:{
  11. type:String
  12. }
  13. },
  14. methods:{
  15. onInput(e){
  16. const value = e.target.value
  17. this.$emit('input',value) //发value出去
  18. }
  19. }
  20. }
  21. </script>

App.vue

  1. <template>
  2. <MyInput :value="user.username" @input="user.username = $event" />//接收子组件发出来的value
  3. </template>
  4. <script>
  5. import MyInput from './MyInput.vue'
  6. export default {
  7. name: 'App',
  8. components: {
  9. MyInput
  10. },
  11. data() {
  12. return {
  13. user: {
  14. username: ""
  15. }
  16. }
  17. },
  18. }
  19. </script>

上面例子,不写methods的方式来做,但一般还是不使用这个方式
MyInput.vue

  1. <template>
  2. <div>
  3. <input :value="_value" @input="_value"=$event.target.value /> //原生版的
  4. <input :value="_value" @input="_value"=$event /> //自定义组件版的
  5. </div>
  6. </tempalate>
  7. <script>
  8. export default {
  9. name:'MyInput',
  10. props:{
  11. value:{
  12. type:String
  13. }
  14. },
  15. computed:{
  16. _value:{
  17. get(){
  18. return this.value
  19. },
  20. set(newValue){
  21. this.$emit("input",newValue)
  22. }
  23. }
  24. }
  25. }
  26. </script>

资料来源:饥人谷