MyLogin.vue 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <template>
  2. <div class="login">
  3. <div class="login-header">
  4. <span :class="{ active: isQr }" @click="isQr = true">扫码登录</span>
  5. <span></span>
  6. <span :class="{ active: !isQr }" @click="isQr = false">账户登录</span>
  7. </div>
  8. <div class="login-body">
  9. <!-- 使用条件渲染 是可以的。但实际上还有更好的实现:利用动态组件 -->
  10. <!-- <SmLogin v-if="isQr" />
  11. <AcLogin v-else /> -->
  12. <!-- 在Vue中内置一个名为 'component' 组件,该组件就是动态组件。component组件在渲染时 有绑定is属性决定 -->
  13. <!-- 实现时 根据数据属性isQr 生成一个新的数据 (组件名)loginName -->
  14. <!-- 如果isQr = true,loginName='SmLogin' -->
  15. <!-- 如果isQr = false,loginName='AcLogin' -->
  16. <!-- <component :is="loginName" /> -->
  17. <!-- 那么 动态组件 比 条件渲染 有什么优势呢? -->
  18. <!-- 动态组件 可以 配合 内置组件<keep-alive> 实现缓存 -->
  19. <keep-alive :include="['SmLogin', 'AcLogin']" exclude="" max="10">
  20. <component :is="loginName" />
  21. </keep-alive>
  22. </div>
  23. </div>
  24. </template>
  25. <script>
  26. import SmLogin from './SmLogin.vue';
  27. import AcLogin from './AcLogin.vue';
  28. export default {
  29. name: 'MyLogin',
  30. data() {
  31. return {
  32. isQr: true, // 如果是扫码登录 isQr就是 true 否则为false
  33. };
  34. },
  35. computed: {
  36. loginName() {
  37. return this.isQr ? 'SmLogin' : 'AcLogin';
  38. },
  39. },
  40. components: {
  41. SmLogin,
  42. AcLogin,
  43. },
  44. };
  45. </script>
  46. <style scoped>
  47. .login {
  48. width: 400px;
  49. margin: 0 auto;
  50. border: 1px solid #ccc;
  51. border-radius: 4px;
  52. }
  53. .login .login-header {
  54. display: flex;
  55. justify-content: center;
  56. align-items: center;
  57. border-bottom: 1px solid #ccc;
  58. }
  59. .login .login-header span {
  60. flex: 1;
  61. text-align: center;
  62. color: #333;
  63. font-size: 18px;
  64. padding: 8px 0;
  65. }
  66. .login .login-header span:hover {
  67. color: #e4393c;
  68. font-weight: 700;
  69. }
  70. .login .login-header span:nth-child(2) {
  71. flex: 0;
  72. width: 1px;
  73. height: 4px;
  74. border-left: 1px solid #ccc;
  75. }
  76. .login .login-header span.active {
  77. color: #e4393c;
  78. font-weight: 700;
  79. }
  80. </style>