zoukankan      html  css  js  c++  java
  • 自定义组件模拟v-model

    在项目中常常会遇到一个组件中引入好几个子组件的情况,而引入的子组件和子组件之间又需要有数据交互,如果使用父组件作为桥梁进行数据交互这个也是可以的,只是有些麻烦,so最理想的是子组件和子组件自己去交互,记录一下使用子组件和子组件传参并模拟v-model的一个过程

    一、创建项目

    先使用cli 创建一个测试项目
    在这里插入图片描述

    二、添加依赖

    在 package.json中添加所需的element依赖

    
      "dependencies": {
        "element-ui": "^2.10.1"
      }
      
    

    main.js引入

    
    	import 'element-ui/lib/theme-chalk/index.css'
    	import ElementUI from 'element-ui'
    	Vue.use(ElementUI);
    
    

    三、创建组件

    1. 定义header_component

    
    <template>
        <div class="nav-top">
            <div class="go-back" >
                <i class="el-icon-arrow-left icon-back"></i>
            </div>
            <div class="map-name" >{{name}}</div>
            <div class="icon-style">
                <i class="el-icon-edit icon-size"  @click="showEditDialog"></i>
            </div>
        </div>
    </template>
    
    <script type="text/ecmascript-6">
        import BToB from './b_to_b.js';
    
        export default {
            name: "header_component",
            data(){
              return{
                  name:'春节联欢晚会'
              }
            },
            created(){
                this.listenBtoBFromEdit();
            },
            methods:{
                showEditDialog(){
                    BToB.$emit("switch_dialog",true);
                },
                listenBtoBFromEdit(){
                    BToB.$on("update_template_params",val =>{
                        this.name = val;
                    })
                },
    
            }
        }
    </script>
    
    

    2. 定义edit_component

    
    <script type="text/ecmascript-6">
        import BToB from './b_to_b.js';
        export default {
            name: "edit_component",
            data(){
                return{
                    form: {
                        name: '',
                        region: '',
                        date1: '',
                        date2: '',
                        delivery: false,
                        type: [],
                        resource: '',
                        desc: ''
                    },
                    dialogVisible:false
                }
            },
            watch:{
                form:{
                    handler(newValue) {
                        BToB.$emit("update_template_params",newValue.name);
                    },
                    deep: true
                }
            },
            created() {
                this.listenBtoB();
            },
            methods:{
                listenBtoB(){
                    BToB.$on("switch_dialog",val =>{
                        this.dialogVisible = val;
                    })
                }
            }
        }
    </script>
    
    
    

    3. 定义代理js b_to_b.js

    
    	import vue from 'vue';
    	export default new vue();
    
    

    4. 修改helloWorld 组件页面

    <template>
      <div class="container">
        <header-component></header-component>
    
        <edit-component></edit-component>
      </div>
    </template>
    
    <script>
      import HeaderComponent from "@/components/header_component";
      import EditComponent from "@/components/edit_component";
    export default {
        methods: {
        },
      components:{
          HeaderComponent,
          EditComponent
      }
    }
    </script>
    
    
    <style scoped>
    .left-menu{
      width: 230px;
      height:calc(100% - 40px);
    }
    </style>
    
    

    完整目录结构在这里插入图片描述
    最后运行测试如图
    在这里插入图片描述

    完整demo 地址 https://github.com/dengxiaoning/brother-to-brother

  • 相关阅读:
    Codevs_1403_新三国争霸_(Kruskal+动态规划)
    BZOJ_1084_[SCOI2005]_最大子矩阵_(动态规划)
    BZOJ_1180_[CROATIAN2009]_OTOCI_(LCT)
    BZOJ_1611_[Usaco2008_Feb]_Meteor_Shower流星雨_(bfs)
    hdu5338 (二进制,双指针)
    并查集专辑 (poj1182食物链,hdu3038, poj1733, poj1984, zoj3261)
    生成树专题
    生成树相关问题
    uvaLive5713 次小生成树
    如何将无向图变为点/边双连通,如何将有向图变为强连通图
  • 原文地址:https://www.cnblogs.com/dengxiaoning/p/11985854.html
Copyright © 2011-2022 走看看