• 表单和$listener


    v-model:  双向数据绑定语法糖:1.input标签的值根据data里的name确定,所以用:value='name',  2.input标签的值变化,会修改name值,用input事件

    <template>
      <div class="son-container">
        name:
        <!-- <input
          type="text"
          :value="name"
          @input="name = $event.target.value"
          placeholder="请输入名字"
        /> -->
           <input
          type="text"
          v-model="name"
          placeholder="请输入名字"
        />
        <button @click="changename">changename</button>
      </div>
    </template>

    <script>
    export default {
      data() {
        return {
          name: '',
        };
      },
      methods: {
        changename() {
          this.name = '张三';
        },
      },
      watch: {
        name(val) {
          console.log(val);
        },
      },
    };
    </script>

    单选框 /复选框: :在<input>上写v-model,  v-model的值等于value,就会选中;

     <p>
          sex:
          <input type="radio" v-model="sex" value="man" /> 
          <input type="radio" v-model="sex" value="femal" />
        </p>
        <p>
          爱好:
          <input type="checkbox" v-model="loves" value="football" />football 
          <input type="checkbox" v-model="loves" value="basketball" />basketball
          <input type="checkbox" v-model="loves" value="pingpang" />pingpang
        </p>

    loves是数组

    选择框: 单选复选都写在select上;

    <p>
          家乡:
          <select name="province" v-model="provice">
            <option disabled value="">请选择家乡</option>
            <option value="北京">北京</option>
            <option value="天津">天津</option>
            <option value="河北">河北</option>
          </select>
        </p>
        <p>
          家乡:
          <select name="provinces" v-model="loveProvices" multiple>
            <option disabled value="">请选择喜欢的城市</option>
            <option value="北京">北京</option>
            <option value="天津">天津</option>
            <option value="河北">河北</option>
          </select>
        </p>

    provinces是数组;

    $listeners: 父组件传给子组件的事件函数;

    //父组件中
    <template>
      <div class="father-container">
        <Son @submit='sendMessage' />
      </div>
    </template>

    子组件中的$listeners就是submit,可以在子组件中调用父组件的这个函数。

    这个函数也可以用props传值传过来,

    也可以用$emit来触发。

    v-model修饰符:

    • .numver
    • .lazy
    • .trim

    多重事件传递

    comment组件引用了messageArea组件,messageArea组件引用了formdata组件;messageArea组件是公共组件,具体怎么发送ajax,它不知道,必须由引入它的父组件来决定,这就造成了formdata组件填写的数据,必须传给comment,应用事件传值,$emit触发父组件事件的形式,传递两次才可以。

    在comment组件中

    <template>
      <div class="comment-container">
        <MessageArea title="评论列表" :subtitle='`(${data.total})`' :list='data.rows' @submit='submitMessage'/>
      </div>
    </template>
    export default {
      components: {
        MessageArea,
      },
      methods: {
        async submitMessage(config, cb){//提交评论
           const res =  await postComment(config);
           cb(res);
        }
      },
      ...

    在messageArea组件中

     <!-- 消息区域组件,用于文章详情页下的评论和消息页的消息留言 -->
    <template>
      <div class="message-area-container">
        <!-- 表单组件 -->
        <!-- <DataForm v-on="{ submit: submit }" /> -->//第一种形式是v-on={事件属性名:函数,...}
        <DataForm v-on="$listeners" /> //第二种利用了$listeners正好是绑定的事件对象,{submit: fn}注意,这个fn是父元素的methods中的函数,不需要在本组件中的methods中写函数。
      </div>
    </template>

    import DataForm from './DataForm';
     
    export default {
     
      // methods: {
      //   submit(config,cb){
      //     console.log(111);
      //     console.log(this.$listeners);
      //     this.$emit('submit',config,cb)
      //   }
      // },
      components: {
        DataForm,
      },

    formdata

    <template>
      <div class="data-form-container">
        <div class="nickname">
          <div>
            <input
              type="text"
              v-model.trim="nickname"
              placeholder="输入用户昵称"
              maxlength="10"
            />
            <span class="tip">{{ nickname.length + tip.nickname }}</span>
          </div>
    ...
        <div class="submit">
          <button :class="{ disabled: isSubmiting }" @click="submit">
            {{ isSubmiting ? '提交中...' : '提交' }}
          </button>
        </div>
      </div>
    </template>
    <script>
    export default {
      data() {
        return {
          nickname: '',
          content: '',
         
      },
      methods: {
        submit() {
          if(this.nickname.length == 0){
            this.error.nickname = '昵称不能为空';
            return
          }
    ...      
          this.isSubmiting = true;
          this.$emit("submit",{
            content: this.content,
            nickname: this.nickname,
            blogId: this.$route.params.blogId 
          },(res)=>{
            this.isSubmiting = false;
            this.content = '';
            this.nickname = '';
            console.log(res);
          })
        },
      },
    };
    </script>
  • 相关阅读:
    实现图片旋转木马3D浏览效果
    !important的用法
    css中!important的作用
    js深拷贝和浅拷贝
    Javascript 数组循环遍历之forEach
    javascript高级选择器querySelector和querySelectorAll
    CSS3系列教程:HSL 和HSL
    linux 静态库、共享库
    UNIX网络编程之旅-配置unp.h头文件环境
    apue2e unp安装
  • 原文地址:https://www.cnblogs.com/dangdanghepingping/p/14825534.html
Copyright © 2020-2023  润新知