zoukankan      html  css  js  c++  java
  • Vue学习15----父组件主动获取子组件的数据和方法,子组件主动获取父组件的数据和方法

    父组件主动获取子组件的数据和方法:
    1.调用子组件的时候定义一个ref

     <v-header ref="header"></v-header>

    2.在父组件里面通过

     this.$refs.header.属性
     this.$refs.header.方法

    子组件主动获取父组件的数据和方法:

     this.$parent.数据
     this.$parent.方法

    下面写一个例子:
    效果图:

     项目结构:

    App.vue是父组件
    Home.vue是子组件

    父组件:App.vue

    <!--父组件给子组件传值-->
    <template>
      <div>
    
        <IHome ref="home"></IHome>
        <button @click="getSonMethod">父组件调用子组件的方法和属性</button>
      </div>
    </template>
    
    <script>
      /**
    
       父组件主动获取子组件的数据和方法:
    
       1.调用子组件的时候定义一个ref
       <v-header ref="header"></v-header>
       2.在父组件里面通过
       this.$refs.header.属性
       this.$refs.header.方法
    
       子组件主动获取父组件的数据和方法:
       this.$parent.数据
       this.$parent.方法
    
       */
      import IHome from './components/Home.vue';
    
      export default {
        name: 'app',
        data() {
          return {
            title: '标题',
            content:'内容',
          }
        },
        methods:{
          iFatherMethod(arge){
            alert('父组件的iFatherMethod'+arge);
          },
          getSonMethod(){
            //拿到子组件的变量
            alert(this.$refs.home.msg);
            //调用子组件的方法
            this.$refs.home.isonmethod1();
    
          }
        },
        components: {
          /*前面的组件名称不能和html标签一样,会出现冲突*/
          'IHome': IHome,
        }
      }
    </script>
    
    <style lang="scss" scoped>
      .content {
        font-size: 50px;
      }
      button {
        width: 100%;
        line-height: 150px;
        text-align: center;
        font-size: 50px;
      }
    
    
    </style>

    子组件:Home.vue

    <!--模板,里面写html-->
    <template>
      <!--根组件,只能有一个根组件-->
      <div>
        <!--显示父组件传过来的值-->
        <div class="head">{{msg}}</div>
        <button @click="isdiaomethod">子组件调用父组件的方法</button>
      </div>
    </template>
    
    <!--script里面写逻辑-->
    <script>
      export default {
        name: "IHeader",
        data() {
          return {
            msg: '子组件的变量',
          }
        },
        methods: {
            isonmethod1(){
              alert("子组件的isonmethod1方法");
            },
            isdiaomethod(){
              this.$parent.iFatherMethod("111");
            }
        },
      }
    </script>
    
    
    <!--style里面写样式-->
    <style lang="scss" scoped>
      /*scoped  css只在本文件中起作用*/
      .head {
        width: 100%;
        line-height: 150px;
        text-align: center;
        background-color: aqua;
        font-size: 50px;
      }
    
      button {
        width: 100%;
        line-height: 150px;
        text-align: center;
        font-size: 50px;
      }
    
    </style>

    源码下载:
    vuedemo15
    https://download.csdn.net/download/zhaihaohao1/11112029

    转载:https://blog.csdn.net/zhaihaohao1/article/details/89021956

    -----------------------------------------------------------------------自己项目-----------------------------------------------------------------------------------------

    welcome.vue

    <template>
      <div>
        <!-- 引入组件  定义一个on的方法监听子组件的状态 -->
    
        <demo1 ref="demo1"> </demo1>
        <el-button type="primary" @click="getSonMethod">主要按钮</el-button>
      </div>
    </template>
    
    
    <script>
    import demo1 from "./demo1.vue";
    export default {
      components: {
        demo1,
      },
      data() {
        return {
          //父传子值
          num: "",
        };
      },
    
      methods: {
        getSonMethod() {
          //调用子组件的属性
          this.$refs.demo1.dialogFormVisible = true;
        },
      },
    };
    </script>
    
    <style>
    </style>

    demo1.vue

    <template>
      <div>
        <el-dialog title="收货地址" :visible.sync="dialogFormVisible">
          <el-form
            :model="ruleForm"
            :rules="rules"
            ref="ruleForm"
            label-width="100px"
            class="demo-ruleForm"
          >
            <el-form-item label="活动名称" prop="name">
              <el-input v-model="ruleForm.name"></el-input>
            </el-form-item>
            <el-form-item label="活动区域" prop="region">
              <el-select v-model="ruleForm.region" placeholder="请选择活动区域">
                <el-option label="区域一" value="shanghai"></el-option>
                <el-option label="区域二" value="beijing"></el-option>
              </el-select>
            </el-form-item>
            <el-form-item label="活动时间" required>
              <el-col :span="11">
                <el-form-item prop="date1">
                  <el-date-picker
                    type="date"
                    placeholder="选择日期"
                    v-model="ruleForm.date1"
                    style=" 100%"
                  ></el-date-picker>
                </el-form-item>
              </el-col>
              <el-col class="line" :span="2">-</el-col>
              <el-col :span="11">
                <el-form-item prop="date2">
                  <el-time-picker
                    placeholder="选择时间"
                    v-model="ruleForm.date2"
                    style=" 100%"
                  ></el-time-picker>
                </el-form-item>
              </el-col>
            </el-form-item>
            <el-form-item label="即时配送" prop="delivery">
              <el-switch v-model="ruleForm.delivery"></el-switch>
            </el-form-item>
            <el-form-item label="活动性质" prop="type">
              <el-checkbox-group v-model="ruleForm.type">
                <el-checkbox label="美食/餐厅线上活动" name="type"></el-checkbox>
                <el-checkbox label="地推活动" name="type"></el-checkbox>
                <el-checkbox label="线下主题活动" name="type"></el-checkbox>
                <el-checkbox label="单纯品牌曝光" name="type"></el-checkbox>
              </el-checkbox-group>
            </el-form-item>
            <el-form-item label="特殊资源" prop="resource">
              <el-radio-group v-model="ruleForm.resource">
                <el-radio label="线上品牌商赞助"></el-radio>
                <el-radio label="线下场地免费"></el-radio>
              </el-radio-group>
            </el-form-item>
            <el-form-item label="活动形式" prop="desc">
              <el-input type="textarea" v-model="ruleForm.desc"></el-input>
            </el-form-item>
            <el-form-item>
              <el-button type="primary" @click="submitForm('ruleForm')"
                >立即创建</el-button
              >
              <el-button @click="resetForm('ruleForm')">重置</el-button>
            </el-form-item>
          </el-form>
        </el-dialog>
      </div>
    </template>
    
    <script>
    export default {
      //接受父组件的值
      data() {
        return {
          dialogTableVisible: false,
          dialogFormVisible: false,
          ruleForm: {
            name: "",
            region: "",
            date1: "",
            date2: "",
            delivery: false,
            type: [],
            resource: "",
            desc: "",
          },
          rules: {
            name: [
              { required: true, message: "请输入活动名称", trigger: "blur" },
              { min: 3, max: 5, message: "长度在 3 到 5 个字符", trigger: "blur" },
            ],
            region: [
              { required: true, message: "请选择活动区域", trigger: "change" },
            ],
            date1: [
              {
                type: "date",
                required: true,
                message: "请选择日期",
                trigger: "change",
              },
            ],
            date2: [
              {
                type: "date",
                required: true,
                message: "请选择时间",
                trigger: "change",
              },
            ],
            type: [
              {
                type: "array",
                required: true,
                message: "请至少选择一个活动性质",
                trigger: "change",
              },
            ],
            resource: [
              { required: true, message: "请选择活动资源", trigger: "change" },
            ],
            desc: [{ required: true, message: "请填写活动形式", trigger: "blur" }],
          },
          formLabelWidth: "120px",
        };
      },
      methods: {
        submitForm(formName) {
          this.$refs[formName].validate((valid) => {
            if (valid) {
              alert("submit!");
            } else {
              console.log("error submit!!");
              return false;
            }
          });
        },
        resetForm(formName) {
          this.$refs[formName].resetFields();
          this.dialogFormVisible = false;
        },
      },
    };
    </script>
    
    <style>
    </style>

     

  • 相关阅读:
    软件开发流程
    开心一笑 项目的开发和升级(转载知乎)
    转载编程之美
    etc/hosts文件详解
    自己centos7成功的修改了主机名(记录了该改哪些文件)
    CentOS7修改主机名的三种方法
    /etc/hosts文件修改后如何生效
    如何在Linux中显示和设置主机名(适用ubantu、centos等版本)
    Linux centos7 shell 介绍、 命令历史、命令补全和别名、通配符、输入输出重定向
    hadoop学习笔记(四):HDFS文件权限,安全模式,以及整体注意点总结
  • 原文地址:https://www.cnblogs.com/yehuisir/p/14932964.html
Copyright © 2011-2022 走看看