| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- <template>
- <div class="login">
- <div class="login-header">
- <span :class="{ active: isQr }" @click="isQr = true">扫码登录</span>
- <span></span>
- <span :class="{ active: !isQr }" @click="isQr = false">账户登录</span>
- </div>
- <div class="login-body">
- <!-- 使用条件渲染 是可以的。但实际上还有更好的实现:利用动态组件 -->
- <!-- <SmLogin v-if="isQr" />
- <AcLogin v-else /> -->
- <!-- 在Vue中内置一个名为 'component' 组件,该组件就是动态组件。component组件在渲染时 有绑定is属性决定 -->
- <!-- 实现时 根据数据属性isQr 生成一个新的数据 (组件名)loginName -->
- <!-- 如果isQr = true,loginName='SmLogin' -->
- <!-- 如果isQr = false,loginName='AcLogin' -->
- <!-- <component :is="loginName" /> -->
- <!-- 那么 动态组件 比 条件渲染 有什么优势呢? -->
- <!-- 动态组件 可以 配合 内置组件<keep-alive> 实现缓存 -->
- <keep-alive :include="['SmLogin', 'AcLogin']" exclude="" max="10">
- <component :is="loginName" />
- </keep-alive>
- </div>
- </div>
- </template>
- <script>
- import SmLogin from './SmLogin.vue';
- import AcLogin from './AcLogin.vue';
- export default {
- name: 'MyLogin',
- data() {
- return {
- isQr: true, // 如果是扫码登录 isQr就是 true 否则为false
- };
- },
- computed: {
- loginName() {
- return this.isQr ? 'SmLogin' : 'AcLogin';
- },
- },
- components: {
- SmLogin,
- AcLogin,
- },
- };
- </script>
- <style scoped>
- .login {
- width: 400px;
- margin: 0 auto;
- border: 1px solid #ccc;
- border-radius: 4px;
- }
- .login .login-header {
- display: flex;
- justify-content: center;
- align-items: center;
- border-bottom: 1px solid #ccc;
- }
- .login .login-header span {
- flex: 1;
- text-align: center;
- color: #333;
- font-size: 18px;
- padding: 8px 0;
- }
- .login .login-header span:hover {
- color: #e4393c;
- font-weight: 700;
- }
- .login .login-header span:nth-child(2) {
- flex: 0;
- width: 1px;
- height: 4px;
- border-left: 1px solid #ccc;
- }
- .login .login-header span.active {
- color: #e4393c;
- font-weight: 700;
- }
- </style>
|