15-native修饰符、父子间通信传值案例

83 阅读1分钟

[native:将原生事件绑定到组件]

在自定义组件的标签里写原生自带的方法如onclick等是不支持的,因为他会认为这是自己写的方法,想要在自定义的组件上写原生方法,就用自定义方法名.native即可

<myevent title="组件间传值" @myenv = "onmyenv" @click.native="onClick"></myevent>

新建一个组件mypop,写一个弹出框,点关闭按钮后关闭

在父组件定义一个属性值state=false,且通过标签向子组件传递了这个初始值,然后在子组件中接收

<template>
  <view>
    <pubTitle :title = "title" subtitle="about page"></pubTitle>
    <view class="">about页面</view>
    <navigator url="../index/index" open-type="redirect">回到首页</navigator>
    <navigator url="../list/list" open-type="redirect">回到列表页</navigator>
    <myevent title="组件间传值" @myenv = "onmyenv"></myevent>
    <button>开启</button>
    <mypop :state="state"></mypop>
  </view>
</template>

<script>
  export default {
    data() {
      return {
        state: false
      };
    },
    methods:{
      onmyenv(e){
        console.log(e);
      }
    }
  }
</script>

<style lang="scss">

</style>

子组件接收父组件的传值

<template>
  <view>
    <view class="">弹出框样式</view>
    <view class="box" :style=""></view>
    <button size="mini">关闭</button>
  </view>
</template>

<script>
  export default {
    name:"mypop",
    data() {
      return {
        state: false
      };
    },
    props:{
      state:{
        type: Boolean,
        default: false
      }
    }
  }
</script>

<style lang="scss">
.box {
  width: 300rpx;
  height: 300rpx;
  background: hotpink;
}
</style>

[给开启和关闭按钮写点击事件]

在父组件中给开启按钮写点击事件,在子组件中给关闭按钮写点击事件

about.vue

<template>
  <view>
    <pubTitle :title = "title" subtitle="about page"></pubTitle>
    <view class="">about页面</view>
    <navigator url="../index/index" open-type="redirect">回到首页</navigator>
    <navigator url="../list/list" open-type="redirect">回到列表页</navigator>
    <myevent title="组件间传值" @myenv = "onmyenv"></myevent>
    <button @click="clickBtn">开启</button>
    <mypop :state="state"></mypop>
  </view>
</template>

<script>
  export default {
    data() {
      return {
        state: false
      };
    },
    methods:{
      onmyenv(e){
        console.log(e);
      },
      clickBtn(){
        this.state = true
      }
    }
  }
</script>

<style lang="scss">

</style>

子组件mypop.vue

<template>
  <view>
    <view class="">弹出框样式</view>
    <view class="box" :style="{height:state?'300rpx':'0'}"></view>
    <button size="mini" @click="onClose">关闭</button>
  </view>
</template>

<script>
  export default {
    name:"mypop",
    data() {
      return {
        state: false
      };
    },
    props:{
      state:{
        type: Boolean,
        default: false
      }
    },
    methods:{
      onClose(){
        this.state = false
      }
    }
  }
</script>

<style lang="scss">
.box {
  width: 300rpx;
  height: 300rpx;
  background: hotpink;
}
</style>

实现效果:点击开启,盒子展开,点击关闭,盒子隐藏

image.png

image.png

这里会报错啊,不允许改变父组件传过来的值,vue是响应式的,改了可能会数据不同步,这就是vue的单向数据流

所以通过子向父传值的方式用$emit自定义方法传一个false到父组件去

mypop.vue

<template>
  <view>
    <view class="">弹出框样式</view>
    <view class="box" :style="{height:state?'300rpx':'0'}"></view>
    <button size="mini" @click="onClose">关闭</button>
  </view>
</template>

<script>
  export default {
    name:"mypop",
    data() {
      return {
        state: false
      };
    },
    props:{
      state:{
        type: Boolean,
        default: false
      }
    },
    methods:{
      onClose(){
        // 这样直接改变父组件的值会报错
        // this.state = false
        this.$emit("stateEnv", false)
      }
    }
  }
</script>

<style lang="scss">
.box {
  width: 300rpx;
  height: 300rpx;
  background: hotpink;
}
</style>

然后在父组件中接收,把接收到的的值重新赋值给state

<template>
  <view>
    <!-- <pubTitle :title = "我们" subtitle="about page"></pubTitle> -->
    <view class="">about页面</view>
    <navigator url="../index/index" open-type="redirect">回到首页</navigator>
    <navigator url="../list/list" open-type="redirect">回到列表页</navigator>
    <myevent title="组件间传值" @myenv = "onmyenv"></myevent>
    <button @click="clickBtn">开启{{state}}</button>
    <mypop :state="state" @stateEnv="onStateEnv"></mypop>
  </view>
</template>

<script>
  export default {
    data() {
      return {
        state: false
      };
    },
    methods:{
      onmyenv(e){
        console.log(e);
      },
      clickBtn(){
        this.state = true
      },
      onStateEnv(e){
        console.log(e);
        this.state = e
      }
    }
  }
</script>

<style lang="scss">

</style>