美文网首页
巧用PropSync封装弹窗组件

巧用PropSync封装弹窗组件

作者: FriendlyJesse | 来源:发表于2020-07-07 08:57 被阅读0次

    安装 Element-ui

    由于我们项目采用的是 vue + ts + element-ui,这里我们谈的是如何二次封装Element-uidialog组件

    npm i element-ui -S
    

    /plugins/element.ts

    import Vue from 'vue'
    import Element from 'element-ui'
    import '../element-variables.scss'
    
    Vue.use(Element)
    

    /main.ts

    import './plugins/element.js'
    

    第一种方式

    子组件

    <el-dialog @close="$emit('toogle', false)" :visible.sync="currentIsShow"></el-dialog>
    
    <script lange="ts">
    import { Component, Vue } from 'vue-property-decorator'
        
    export default class Email extends Vue {
        @Prop() isShow!: boolean // 是否默认显示
        currentIsShow = false
        @Watch('isShow')
        onChangeValue(newVal: boolean){
            this.currentIsShow = newVal
        }
    }
    </script>
    

    父组件

    <SetEmail :isShow="setEmailShow" :verify="true" @toogle="setEmailToogle"></SetEmail>
    
    <script lang="ts">
    import { Component, Vue } from 'vue-property-decorator'
        
    export default class Parent extends Vue {
        // 邮箱 dialog
        setEmailShow = false
        setEmailToogle (flag: boolean) {
           this.setEmailShow = flag
        }
    }
    </script>
    

    但是由于 vue 提供了 .sync,所以我们可以更加方便的方式

    子组件

    <el-dialog @close="$emit('update:show', false)" :visible.sync="visible"></el-dialog>
    
    <script lang="ts">
    import { Component, Vue } from 'vue-property-decorator'
        
    export default class Email extends Vue {
        // 显示切换
        @Prop() show!: boolean
        visible = false
        @Watch('show')
        onChangeValue(newVal: boolean){
            this.visible = newVal
        }
    }
    </script>
    

    父组件

    <set-email :show.sync="setEmailShow" :verify="false"></set-email>
    
    <script lang="ts">
    import { Component, Vue } from 'vue-property-decorator'
        
    export default class Parent extends Vue {
        setEmailShow = false // 修改邮箱
    }
        
    </script>
    

    没错,使用 .sync能让我们不需要监听事件变动而修改父级变量

    别急,还有更方便的

    子组件

    <el-dialog @close="$emit('update:show', false)" :visible.sync="visible"></el-dialog>
    
    <script lang="ts">
    import { Component, Vue } from 'vue-property-decorator'
        
    export default class Email extends Vue {
        @PropSync('show') visible!: boolean // 显示切换
    }
    </script>
    

    父组件

    <set-email :show.sync="setEmailShow" :verify="false"></set-email>
    
    <script lang="ts">
    import { Component, Vue } from 'vue-property-decorator'
        
    export default class Parent extends Vue {
        setEmailShow = false // 修改邮箱
    }
        
    </script>
    

    这里的 @PropSync又能让我们在子组件中减少一部分代码。

    相关文章

      网友评论

          本文标题:巧用PropSync封装弹窗组件

          本文链接:https://www.haomeiwen.com/subject/rdgoqktx.html