Vue作业2022/10/19——组件间的通信

本文详细介绍了Vue组件间的父子通讯方式,包括v-model动态绑定、props单向数据流,以及如何保存原数据并处理副本。还涵盖了子组件向父组件传递数据的自定义事件和数据转换的应用实例。

1.子组件接收来自父组件的动态绑定的数据

父组件中的内容:

<template>
  <div id="app">
    <input type="text" v-model="s_value">
    <slot_demo :f_value="s_value"></slot_demo>
  </div>
</template>

<script>
import slot_demo from "@/components/slot_demo";

export default {
  name: 'App',
  components: {
    slot_demo
  },
  data(){
    return {
      s_value:'来自父级的数据'
    }
  }
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

子组件中的内容:

<template>
  <div>
    <p>子组件中接收到的来自父组件的数据:{{f_value}}</p>
  </div>
</template>

<script>
export default {
  name: "slot_demo",
  props:['f_value'],
  data(){
    return {
      msg:'组件中的数据'
    }
  }
}
</script>

<style scoped>

</style>

注意点:

在父组件的传递数据的属性上绑定v_bind属性,并将属性值改为父组件data节点中的变量名,当修改父组件中的值的时候子组件中的值也会随着一起被修改,需要注意的是这种数据流向只能单向的从父组件流向子组件。当修改子组件的props数组中的值的时候Vue会直接报错

 这个洋文报错的意思是不建议你修改从props数组中接收到的变量值


2.子组件向父组件通信

子组件通过自定义事件的方式向父组件传递数据

父组件中的内容:

<template>
  <div id="app">
    {{count}}
    <slot_demo @CountAdd="GetCount" @CountRed="GetCount"></slot_demo>
  </div>
</template>

<script>
import slot_demo from "@/components/slot_demo";

export default {
  name: 'App',
  components: {
    slot_demo
  },
  data(){
    return {
      count: 0
    }
  },
  methods:{
    GetCount(count){
      this.count = count
    }
  }
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

父组件中的内容:

<template>
  <div>
    <button type="button" @click="add">点击+1</button>
    <button type="button" @click="red">点击-1</button>
  </div>
</template>

<script>
export default {
  name: "slot_demo",
  data(){
    return {
      count:0
    }
  },
  methods:{
    add(){
      this.count++
      this.$emit('CountAdd',this.count)
    },
    red(){
      this.count--
      this.$emit('CountRed',this.count)
    }
  }
}

</script>

<style scoped>

</style>

注意点:

示例的大概意思是在子组件中定义两个方法,一个加法一个减法,操作子组件中的一个变量,并在子组件中定义点击事件控制方法,并通过自定义事件将操作过的数据传递给父组件。在父组件的子组件标签上定义了两个自定义事件,值是父组件中的同一个方法,这个方法接收子组件中的数据并赋值给父组件的变量中再渲染到页面中


3.保存从父组件传递的原数据,并操作副本数据

当遇到需要经常修改接收到的父组件传递的值,但是同时又需要保持元数据不变,可以将接收到的数据存储到子组件的data节点中的变量副本中,操作变量中的数据即可

父组件中的内容:

<template>
  <div id="app">
    <slot_demo :f_value="count"></slot_demo>
  </div>
</template>

<script>
import slot_demo from "@/components/slot_demo";

export default {
  name: 'App',
  components: {
    slot_demo
  },
  data(){
    return {
      count: 0
    }
  },
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

子组件中的内容:

<template>
  <div>
    <p>接收到的原数据:{{f_value}}</p>
    <p>修改子组件中的数据副本:{{count}}</p>
    <button type="button" @click="add">点击加一</button>
  </div>
</template>

<script>
export default {
  name: "slot_demo",
  props:['f_value'],
  data(){
    return {
      count:this.f_value
    }
  },
  methods:{
    add(){
      this.count++
    }
  }
}

</script>

<style scoped>

</style>

注意点:

当有需求需要频繁修改接收子组件接收到的父组件的值,但是又需要随时恢复原值的时候可以使用这个特性


4.当需要对父组件传递的值再次进行转换的时候

当父组件传递的数据不能直接使用需要进行一定的修改的时候,比如当父组件传递的是一个数字,但是需要在使用的时候加上单位,就可以使用这个特性

父组件中的内容:

<template>
  <div id="app">
    <slot_demo :f_value="count" :f_color="color"></slot_demo>
    <input type="text" v-model="count">
    <input type="text" v-model="color">
  </div>
</template>

<script>
import slot_demo from "@/components/slot_demo";

export default {
  name: 'App',
  components: {
    slot_demo
  },
  data(){
    return {
      count: 100,
      color: 'red'
    }
  },
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

子组件的内容:

<template>
  <div>
    <div :style="style">
      <p>你好世界</p>
    </div>
  </div>
</template>

<script>
export default {
  name: "slot_demo",
  props:['f_value','f_color'],
  data(){
    return {
      width:'',
      height:'',
      color:''
    }
  },
  computed:{
    style(){
       return {
         width:this.f_value + 'px',
         height:this.f_value + 'px',
         backgroundColor:this.f_color
       }
    },
  }
}

</script>

<style scoped>

</style>

注意点:

案例是结合接收父组件传递的动态值的方式,将父组件的第一个值作为子组件div标签的宽高,第二个值作为背景颜色,并通过输入的值来实时修改成对应的大小。需要注意的是,在计算属性中,需要返回一个对象,即return的返回值必须用花括号括起来,原本的等号赋值,变成使用冒号赋值,然后将接受的值变成带有px单位的可以应用在样式中的属性值。

### 实现 UniApp 和 Vue3 中父子组件传参的方法 在 UniApp 和 Vue3 的开发环境中,父子组件之间的参数传递主要通过 `props` 和 `$emit` 来完成。以下是详细的说明以及示例代码。 #### 父组件子组件 父组件可以利用 `props` 将数据传递到子组件中。子组件通过声明接受这些属性来进行绑定并显示相关内容[^1]。 ```html <!-- 父组件 --> <template> <view class="container"> <!-- 使用 props 向子组件传递 fatherNum --> <child-component :father-num="parentValue"></child-component> </view> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { parentValue: 42 // 这是要传递给子组件的数据 }; } }; </script> ``` 子组件接收到这个后会自动更新其内部状态: ```html <!-- 子组件 --> <template> <view> 我是子呀,接收我父给我的:{{ fatherNum }} </view> </template> <script> export default { props: ['fatherNum'], // 接收来自父组件的参数 data() { return {}; } }; </script> ``` #### 子组件父组件 当需要从子组件发送消息或者更改通知给父组件时,则可采用事件机制 `$emit` 完成反向通信过程[^2]。 ```html <!-- 子组件 --> <button @click="sendSon">子来修改父了</button> <script> export default { methods: { sendSon() { this.$emit('updateSon', 2); // 发送新数至父级处理逻辑处 } } }; </script> ``` 而对应的父组件则需监听此特定名称之下的触发动作,并据此调整自身变量内容: ```html <!-- 父组件 --> <child-component :father-num="parentValue" @updateSon="handleUpdateFromChild" ></child-component> <script> methods: { handleUpdateFromChild(newValue) { this.parentValue = newValue; } } </script> ``` 以上展示了完整的双向交互流程——即由上往下推送初始配置资料的同时也允许下层反馈最新状况至上端管理者那里去同步反映出来[^5]。 #### 结合实际场景应用案例分析 对于更复杂的业务需求来说可能还会涉及到列表渲染等情况,在这种情况下我们同样能够借助类似的原理达成目标。比如展示一系列新闻条目并且每一个都可以单独点击查看详情页面等功能实现方式如下所示[^3]: ```html // 父组件部分 <newsbox v-for="(item,index) in listData" :key="index" :item-info="item"/> <script setup> let listData = [ {name:"张三",age:"18"}, {name:"李四",age:"19"} ]; </script> ``` 这里的关键在于循环结构配合动态绑定特性使得每次迭代产生的实例都能获得独一无二的一组输入源从而形成各自独立的小型模块化单元体存在于此布局之中[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值