uni-app的自定义组件

        在uni-app中,我们可以使用Vue的组件语法来自定义组件,其中包括组件的数据、属性、事件以及方法等。自定义组件可以让我们在不同的项目中很方便地重用和修改组件,同时可以提高组件库的扩展性和应用的灵活性。

        在uni-app中,我们可以在项目的component目录下存放组件,uni-app只支持vue单文件组件(.vue)。

一、注册

1、全局注册

  uni-app 支持配置全局组件,需在 main.js 里进行全局注册,注册后就可在所有页面里使用该组件。 

//main.js 里进行全局导入和注册
import Vue from 'vue'
import pageHead from './components/page-head.vue'
Vue.component('page-head',pageHead)

//index.vue 里可直接使用组件
<template>
	<view>
		<page-head></page-head>
	</view>
</template>

2、局部注册

        页面引入组件有两种方式,推荐使用 easycom 方式引入。

1.传统vue规范 

        在 index.vue 页面中,通过 import 方式引入组件 ,在 components 选项中定义你想要使用的组件。

	<!-- 在index.vue引入 uni-badge 组件-->
	<template>
		<view>
            <!-- 3.使用组件 -->
			<uni-badge text="1"></uni-badge>
		</view>
	</template>
	<script>
        //1.导入组件(这步属于传统vue规范,但在uni-app的easycom下可以省略这步)
		import uniBadge from '@/components/uni-badge/uni-badge.vue';
		export default {
            //2.注册组件(这步属于传统vue规范,但在uni-app的easycom下可以省略这步) 
			components:{uniBadge }
		}
	</script>

 2.easycom 方式

     将组件引入精简为一步。只要组件安装在项目的 components 目录下,并符合 components/组件名称/组件名称.vue 目录结构。就可以不用引用、注册,直接在页面中使用。

	<!-- 在index.vue引入 uni-badge 组件-->
	<template>
		<view>
            <!-- 直接使用组件 -->
			<uni-badge text="1"></uni-badge>
		</view>
	</template>
	<script>
		// 这里不用import引入,也不需要在components内注册uni-badge组件。template里就可以直接用
		export default {
			data() {
				return {
				}
			}
		}
	</script>

二、父子组件通信

        父子组件之间的通信有两种方式:父传子和子传父。其中,父传子的方式是通过props来实现的,子组件通过props来接收外界传递到组件内部的值。而子传父的方式则是通过$emit触发事件进行传递参数,父组件通过监听这个事件来接收子组件传递过来的数据 。

父传子组件的示例代码:

        父组件通过props属性将message传递给子组件。子组件则通过props接收这个值并在模板中显示出来。

<!-- 父组件 -->
<template>
  <div>
    <child-component :message="parentMessage"></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';
export default {
  components: {
    ChildComponent,
  },
  data() {
    return {
      parentMessage: 'Hello from parent!',
    };
  },
};
</script>


<!-- 子组件 -->
<template>
  <div>
    {{ message }}
  </div>
</template>

<script>
export default {
  props: ['message'],
};
</script>

子传父组件的示例代码:

        子组件通过$emit触发了一个名为childEvent的事件,并将数据作为参数传递给父组件。父组件则通过监听这个事件来接收子组件传递过来的数据,并在handleChildEvent方法中进行处理。

<!-- 父组件 -->
<template>
  <div>
    <child-component @childEvent="handleChildEvent"></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';
export default {
  components: {
    ChildComponent,
  },
  methods: {
    handleChildEvent(data) {
      console.log('Received data from child component:', data);
    },
  },
};
</script>


<!-- 子组件 -->
<template>
  <div>
    <button @click="sendDataToParent">Send data to parent</button>
  </div>
</template>

<script>
export default {
  methods: {
    sendDataToParent() {
      const data = 'Hello from child!';
      this.$emit('childEvent', data);
    },
  },
};
</script>

三、uni.$on与uni.$emit

        uni.$on是uni-app中的一个全局事件监听方法,用于在页面或组件外部监听指定事件的触发。当事件被触发时,会执行传入的回调函数。使用uni.$on方法可以避免在每个页面或组件中都手动注册和注销事件监听器的问题,提高了代码的复用性和可维护性。

       uni.$emit是一个全局事件触发器,用于向父组件或全局事件触发器发送事件。

示例代码:

//子组件触发自定义事件
<template>
  <div>
    <button @click="sendDataToParent">Send data to parent</button>
  </div>
</template>

<script>
export default {
  methods: {
    sendDataToParent() {
      const data = 'Hello from child!';
      uni.$emit('childEvent', data); // 触发自定义事件
    },
  },
};
</script>


// 在父组件中监听子组件触发的自定义事件
export default {
  onLoad() {
    uni.$on('childEvent', this.handleChildEvent); // 注册事件监听器
  },
  beforeDestroy() {
    uni.$off('childEvent', this.handleChildEvent); // 注销事件监听器
  },
  methods: {
    handleChildEvent(data) {
      console.log('Received data from child component:', data);
    },
  },
};

 四、slot插槽

        插槽是一种用于向子组件传递内容的方式。插槽实质是对子组件的扩展,父组件通过slot插槽向子组件内部指定位置传递内容。插槽显不显示、怎样显示是由父组件来控制的,而插槽在哪里显示就由子组件来进行控制。

插槽的示例代码:

<!-- 子组件 -->
<template>
  <div>
    <slot name="header"></slot> <!-- 使用具名插槽 -->
    <slot></slot> <!-- 使用默认插槽 -->
    <slot name="footer"></slot> <!-- 使用具名插槽 -->
  </div>
</template>

<script>
export default {};
</script>


<!-- 父组件 -->
<template>
  <div>
    <child-component>
      <template v-slot:header>
        <h2>组件的头部</h2>
      </template>
      <p>组件的内容。</p>
      <template v-slot:footer>
        <button @click="handleClick">点击我</button>
      </template>
    </child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';
export default {
  components: {
    ChildComponent
  },
};
</script>

五、ref 

        被用来给元素或子组件注册引用信息,引用信息将会注册在父组件的 $refs 对象上。

如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向组件实例。在非H5端,只能用于获取自定义组件实例,不能用于获取内置组件实例(如:view、text)。

<!-- 非H5端不支持通过this.$refs.content来获取view实例 -->
<view ref="content">hello</view>

<!-- 支持通过this.$refs.child来获取child-component实例 -->
<child-component ref="child"></child-component>

代码示例:

<!-- base-input子组件页面 -->
<template>
	<view>
		<input :focus="isFocus" type="text" placeholder="请输入内容" />
	</view>
</template>
<script>
	export default {
		name:"base-input",
		data() {
			return {
				"isFocus":false
			};
		},
		methods:{
			focus(){
				this.isFocus = true
			}
		}
	}
</script>

<!-- index 父组件页面 -->
<template>
	<view>
		<base-input ref="usernameInput"></base-input>
		<button type="default" @click="getFocus">获取焦点</button> 
	</view>
</template>
<script>
	export default {
		methods:{
			getFocus(){
				//通过组件定义的ref调用focus方法
				this.$refs.usernameInput.focus()
			}
		}
	}
</script>
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UniApp 是一个基于 Vue.js 的跨平台开发框架,可以用来开发微信小程序、H5、App等多个平台的应用。在 UniApp 中,可以通过自定义组件来实现对小程序的扩展和复用。 要创建一个自定义组件,可以按照以下步骤进行: 1. 在 UniApp 项目的 `components` 目录下创建一个新的文件夹,用于存放自定义组件的相关文件。 2. 在该文件夹下创建一个 `.vue` 文件,作为自定义组件的入口文件。 3. 在入口文件中定义组件的模板、样式和逻辑代码。 4. 在需要使用自定义组件的页面或组件中,引入并使用该自定义组件。 下面是一个简单的示例,演示如何创建一个自定义组件: 1. 在 `components` 目录下创建一个名为 `my-component` 的文件夹。 2. 在 `my-component` 文件夹下创建一个名为 `my-component.vue` 的文件,作为自定义组件的入口文件。 3. 在 `my-component.vue` 文件中编写如下代码: ```html <template> <view class="my-component"> <text>{{ message }}</text> </view> </template> <script> export default { name: 'MyComponent', props: { message: { type: String, default: '' } } } </script> <style scoped> .my-component { color: red; } </style> ``` 4. 在需要使用自定义组件的页面或组件中,引入并使用该自定义组件。例如,在某个页面的 `.vue` 文件中: ```html <template> <view> <my-component message="Hello World"></my-component> </view> </template> <script> import MyComponent from '@/components/my-component/my-component.vue' export default { components: { MyComponent } } </script> ``` 这样,就可以在页面中使用名为 `my-component` 的自定义组件了。 需要注意的是,自定义组件的文件夹和文件名可以根据实际情况进行命名,但要保持一致性。另外,自定义组件中的样式可以使用 `scoped` 关键字来实现样式的隔离,避免与其他组件的样式冲突。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值