博客列表 >VUE组件

VUE组件

kong
kong原创
2024年01月09日 15:25:36209浏览

组件化开发

prop向子组件传递数据

  1. <template>
  2. <!-- 绑定变量传值 -->
  3. <Content :title="title" :msg="msg" :arr="arr" :ob="ob" />
  4. </template>
  5. <script>
  6. import OneCom from "./components/OneCom.vue";
  7. export default {
  8. data() {
  9. return {
  10. title: "标题",
  11. msg: "消息",
  12. arr : [
  13. '苹果',
  14. '香蕉',
  15. '梨子'
  16. ],
  17. ob: {
  18. name: "小明",
  19. age: "18岁"
  20. }
  21. };
  22. },
  23. components:{
  24. Content
  25. }
  26. };
  27. </script>
  28. <!--子组件-->
  29. <template>
  30. <div>
  31. <div>{{ title }}</div>
  32. <div>{{ msg }}</div>
  33. <div>{{ arr }}</div>
  34. <div>{{ ob }}</div>
  35. </div>
  36. </template>
  37. <script>
  38. export default {
  39. data() {
  40. return {
  41. };
  42. },
  43. // 1、props 参数,获取父文件的传值
  44. props: ["title", "msg", "arr", "ob"]
  45. };
  46. </script>

接收值并限制类型

有两种接收值的方法

第一种 数组字符串方法

props['接收值1','接收值2'...]

第二种 对象限制接收参数的类型

数组和对象要用方法返回

type: 类型 String ,Number, Object, Arr…
default: 不传值,给一个默认值
required: true,必须传的值,

子组件向父组件传值,事件传值

  1. //App.vue文件
  2. <template>
  3. <!-- 在父元素中使用子元素自定的事件名 -->
  4. <Content @click="EditChange()" />
  5. </template>
  6. <script>
  7. import Content from "./components/aj.vue"; //子元素
  8. export default{
  9. data(){
  10. return{
  11. value: '父组件值'//默认值
  12. }
  13. },
  14. methods: {
  15. //操作方法
  16. EditChange(){
  17. this.value = "改变的值"
  18. }
  19. },
  20. components: {
  21. //组件
  22. Content,
  23. }
  24. }
  25. </script>
  26. //aj.vue文件
  27. <template>
  28. <div>
  29. <button @click="edit()">点击改变父组件的值</button>
  30. </div>
  31. </template>
  32. <script>
  33. export default{
  34. data(){
  35. return{
  36. }
  37. },
  38. methods:{
  39. edit(value){
  40. //使用 $emit方法 $emit('自定义事件名',要传的值)
  41. this.$emit('EditChange',value)
  42. }
  43. }
  44. }
  45. </script>

父子组件访问方式

父组件访问子组件 $refs

  1. <!--父页面-->
  2. <hi :name="name" :age="age" :sex="sex" ref="hi"/>
  3. export default{
  4. mounted(){
  5. // console.log(this.$refs.hi)
  6. },
  7. }

子组件获取父组件的值 $parent 重叠性很强不适合使用

子组件获取根组件的值 $root

  1. <!--父页面-->
  2. <hi :name="name" :age="age" :sex="sex" ref="hi"/>
  3. <!--子页面-->
  4. export default{
  5. mounted(){
  6. // 子组件获取父组件的值 $parent 重叠性很强不适合使用
  7. // console.log(this.$parent)
  8. // 子组件获取根组件的值 $root
  9. // console.log(this.$root)
  10. }
  11. }

slot插槽

使用 slot 标签,做为占位:也叫插槽

  1. //OneCom.vue子文件
  2. <template>
  3. <div>
  4. <slot></slot>
  5. </div>
  6. </template>
  7. //App.vue 文件
  8. <template>
  9. <div>
  10. // 使用子组件,传button标签
  11. <one-com>
  12. <button>按钮</button>
  13. </one-com>
  14. </div>
  15. </template>
  16. <script>
  17. import OneCom from "./components/OneCom";
  18. export default {
  19. data() {
  20. return {};
  21. },
  22. components: {
  23. OneCom
  24. }
  25. };
  26. </script>

slot插槽命名

如果多个插槽,传2次按钮,会出现4个按钮,所以要用命名的方法

  1. //OneCom.vue 子文件
  2. <template>
  3. <div>
  4. <div class="flex">
  5. <slot name="top"></slot>
  6. <slot></slot>
  7. </div>
  8. </div>
  9. </template>
  10. //App.vue
  11. <template>
  12. <div>
  13. <one-com>
  14. // 使用 template 标签,v-slot参数,找到对应的插槽name名字
  15. <template v-slot:top>
  16. <button>按钮</button>
  17. </template>
  18. <button>按钮</button>
  19. </one-com>
  20. <one-com>
  21. <a>a链接</a>
  22. // 也可以#简写,是v-slot的语法糖
  23. <template #top>
  24. <a>a链接</a>
  25. </template>
  26. </one-com>
  27. <one-com>
  28. // 查找默认插槽
  29. <template v-slot:default>
  30. <a>a标签</a>
  31. </template>
  32. </one-com>
  33. </div>
  34. </template>
  35. <script>
  36. import OneCom from "./components/OneCom";
  37. export default {
  38. components: {
  39. OneCom,
  40. }
  41. };
  42. </script>

父级使用插槽,使用子组件数据

  1. //子元素
  2. <template>
  3. <div>
  4. <div class="flex">
  5. <slot :list="list"></slot>
  6. </div>
  7. </div>
  8. </template>
  9. <script>
  10. export default {
  11. data(){
  12. return{
  13. list:[1,2,3,4,5]
  14. }
  15. }
  16. }
  17. </script>
  18. //App.vue
  19. <template>
  20. <div>
  21. <OneCom>
  22. <!-- 作用域插槽此处的data命名可以任意 default代表着子组件的slot默认name值-->
  23. <template v-slot:default="data">
  24. <ul>
  25. <li v-for="item in data.list" :key="item" @click="lis">
  26. {{ item }}
  27. </li>
  28. </ul>
  29. </template>
  30. </OneCom>
  31. </div>
  32. </template>
  33. <script>
  34. import OneCom from './OneCom.vue'
  35. export default {
  36. data(){
  37. return{}
  38. },
  39. components:{
  40. OneCom
  41. }
  42. }
  43. </script>

使用provide 与inject跨通信传值(父组件改变子孙组件)

  1. //OneCom.vue 子元素
  2. <template>
  3. <div>
  4. <h1>
  5. {{ newMessage }}
  6. </h1>
  7. </div>
  8. </template>
  9. <script>
  10. export default {
  11. inject: ['message'], //接收父组件传递的值
  12. data(){
  13. return{}
  14. },
  15. computed:{
  16. newMessage(){
  17. return this.message()
  18. }
  19. },
  20. }
  21. </script>
  22. //App.vue
  23. <template>
  24. <div>
  25. <HelloWorld></HelloWorld>
  26. <button @click="msgs">点击</button>
  27. </div>
  28. </template>
  29. <script>
  30. import OneCom from './OneCom.vue'
  31. export default {
  32. data(){
  33. return{
  34. message:"helloWorld"
  35. }
  36. },
  37. provide(){
  38. return{
  39. message:()=> this.message //传递到子孙组件动态值
  40. }
  41. },
  42. methods:{
  43. msgs(){ //点击改变的事件
  44. this.message = '消息改变了'
  45. }
  46. }
  47. }
  48. </script>
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议