A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xiaofeifei112 中级黑马   /  2019-1-17 20:35  /  1022 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

[AppleScript] 纯文本查看 复制代码
    - myLogin
      - index.js
      - myLogin.vue

> main.js
[JavaScript] 纯文本查看 复制代码
    // 加载插件
    import myLogin from './assets/myLogin';
    // 将插件挂载到Vue上
    Vue.use(myLogin);

> index.js

[AppleScript] 纯文本查看 复制代码
// 引入myLogin组件
import myLogin from './myLogin';

// 对外暴露install方法给Vue.use使用挂载到Vue上
export default {
  install(Vue) {
    // 在全局注册 myLogin 组件
    Vue.component('myLogin', myLogin);
  }
}

myLogin.vue
[HTML] 纯文本查看 复制代码
<template>
  <div class="my_login_box">
    <p>
      <span> 手机号: </span>

      <input type="text" ref="phone" v-model="phone">
      <!-- 写一个插槽,插槽名phone 插槽暴露数据phone 提供给slot-scope使用 -->
      <slot name="phone" :phone="myProps.phone"></slot>
    </p>
    <p>
      <span> 密码: </span>
      <input type="password" ref="password" v-model="word">
      <!-- 写一个插槽,插槽名word 插槽暴露数据word 提供给slot-scope使用 -->
      <slot name="word" :word="myProps.word"></slot>
    </p>
    <p>
      <button @click="submit"> 确定</button>
    </p>
  </div>
</template>

<script>
  export default {
    name: "myLogin",
    // 获取父组件传递过来的数据 phoneReg ,wordReg,prompt
    /**
     *
     * phoneReg 手机的正则匹配
     * wordReg 密码的正则匹配
     * prompt 提示信息
     * */
    props: {
      phoneReg: {
        // type 数据类型 , default 默认值 ,不是原始数据类型需要使用函数return出来
        type: RegExp,
        default: () => /^1[34578]\d{9}$/
      },
      wordReg: {
        type: RegExp,
        default: () => /^[\w]{6,12}$/
      },
      prompt: {
        type: Object,
        default: () => {
          return {phone: '错误', word: '错误'}
        }
      }
    },
    data() {
      return {
        phone: '',
        word: '',
        myProps: {
          phone: '',
          word: ''
        }
      }
    },
    methods: {
      // 点击事件
      submit() {
        // 一上来清空提示
        this.myProps.phone = '';
        this.myProps.word = '';
        // 判断数据是否符合正则的需求
        if (!this.phoneReg.test(this.phone)) return this.myProps.phone = this.prompt.phone;
        if (!this.wordReg.test(this.word)) return this.myProps.word = this.prompt.word;
        // 信息判断正确之后调用父组件submit方法 ,并且将结果传递过去。
        this.$emit('submit', {phone: this.phone, word: this.word});
      }

    },
    // 一上来挂载 input 事件
    mounted() {
      // 获取this
      let _this = this;
      // 每一输入的时候触发事件,并且将当前的数据传递过去。
      this.$refs['phone'].addEventListener('input', function () {
        _this.$emit('phoneJudge', _this.phone)
      });

      this.$refs['password'].addEventListener('input', function () {

        _this.$emit('wordJudge', _this.word)
      });
    }
  }


</script>

<style scoped>
  .my_login_box {
    width: 300px;
    height: 450px;
    border: 1px solid #000;
  }
</style>

> 引用组件的页面
[HTML] 纯文本查看 复制代码
<template>
  <div class="hello">

    <!---  调用my-login 组件 ,传入新的手机验证的正则  -->
    <!-- 添加点击事件 ,二个输入框的的输入事件,同时传入新的提示信息 -->
    <my-login
      :phone-reg="/^[1][3,4,5,7,8][0-9]{9}$/"
      @submit="submit"
      @phoneJudge="phoneVerify"
      @wordJudge="wordVerify"
      :prompt="prompt"
    >
      <template slot-scope="props" slot="phone">
        <p>
          {{ props.phone }}
        </p>
      </template>
      <template slot-scope="props" slot="word">
        <p>
          {{ props.word }}
        </p>
      </template>

    </my-login>

  </div>
</template>

<script>


  export default {
    name: 'HelloWorld',
    data() {
      return {
        prompt: {phone: '你输入的手机号错误', word: '你输入的密码异常'}
      }
    },
    methods: {
      submit(val) {
        console.log(`用户点击确定了手机号:${val.phone};密码:${val.word}`)
      },
      phoneVerify(val) {
        console.log(`用户正在操作手机号码输入框${val}`)
      },
      wordVerify(val) {
        console.log(`用户正在操作密码输入框${val}`)
      }
    }
  }
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>

</style>


> 这个组件就是一个简单的登录组件。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马