自定义封装搜索组件

以下是在鸿蒙中封装搜索组件的一般步骤和示例代码:

创建搜索组件的界面结构: 

      定义组件的基本结构:使用 @component 装饰器定义一个结构体来表示搜索组件。在结构体       的 build 方法中,使用 RowColumn 等布局组件来构建搜索组件的界面。例如,可以创建一个包含输入框和搜索按钮的 Row 布局。

    @component
    export struct SearchComponent {
        build() {
            Row() {
                // 输入框
                TextInput({ placeholder: '请输入搜索内容' })
                   .height('40vp')
                   .fontSize('20fp')
                   .enterKeyType(enterKeyType.search)
                   .placeholderColor(color.grey)
                   .placeholderFont({ size: '14vp', weight: 400 })
                   .width('100%')
                   .padding({ left: '35vp', right: '35vp' })
                   .borderStyle(borderStyle.solid)
                   .borderWidth('1vp')
                   .borderColor(color.red);

                // 搜索按钮
                Button({ text: '搜索' })
                   .onClick(() => {
                        // 处理搜索按钮的点击事件
                    });
            }
           .alignItems(verticalAlign.center);
        }
    }

处理输入框的输入事件

        监听输入变化:在输入框的 onChange 事件中,监听用户输入的内容变化。当输入内容变化时,可以根据需要进行一些操作,比如实时搜索、显示联想词等3。

    TextInput({
        placeholder: '请输入搜索内容',
        // 监听输入内容的变化
        onChange: (currentContent) => {
            // 处理输入内容的变化
            this.currentInputContent = currentContent;
            // 根据输入内容进行相关操作,如请求联想词等
            if (this.currentInputContent.length > 0) {
                // 输入内容不为空时的操作
            } else {
                // 输入内容为空时的操作
            }
        }
    });

 处理搜索按钮的点击事件

         定义搜索按钮的点击逻辑:在搜索按钮的 onClick 事件中,编写搜索的逻辑代码。可以根据输入框中的内容进行搜索操作,比如向服务器发送搜索请求或者在本地数据中进行搜索1。

    Button({ text: '搜索' })
       .onClick(() => {
            // 获取输入框中的内容
            const searchText = this.currentInputContent;
            // 进行搜索操作
            // 这里可以调用搜索函数或者发送网络请求等
        });

封装和复用搜索组件

        在其他页面中使用搜索组件:在需要使用搜索组件的页面中,导入搜索组件的模块,并在页面的 build 方法中使用搜索组件。

    import { SearchComponent } from './SearchComponent';

    @component
    export struct MyPage {
        build() {
            Column() {
                // 使用搜索组件
                SearchComponent();
            }
        }
    }

样式和交互优化(可选)

  • 样式调整:根据设计需求,对搜索组件的样式进行调整,比如更改输入框的背景颜色、边框样式、光标样式等。可以使用 backgroundColorborderRadiuscaretStyle 等属性来设置样式。
  • 交互优化:对搜索组件的交互进行优化,比如处理输入框的触摸事件、搜索按钮的点击反馈等。可以使用 hitTestBehavior 来处理触摸事件的穿透,使用 loading 效果来显示搜索的状态等。

以上是一个简单的鸿蒙搜索组件的封装示例,具体的实现方式可以根据你的需求进行进一步的扩展和优化。在实际开发中,还需要考虑数据的存储和管理、网络请求的处理、错误处理等方面的问题。 

以下是一个较为完整的鸿蒙封装搜索组件的代码示例:

SearchComponent.ts

import input from '@ohos.input';
import router from '@system.router';

@component
export struct SearchComponent {
  private searchText: string = '';

  build() {
    Column() {
      Row() {
        // 输入框
        TextInput({
          placeholder: '请输入搜索内容',
          onChange: (currentContent) => {
            this.searchText = currentContent;
          },
        })
         .height('40vp')
         .fontSize('20fp')
         .enterKeyType(enterKeyType.search)
         .placeholderColor(color.grey)
         .placeholderFont({ size: '14vp', weight: 400 })
         .width('70%')
         .padding({ left: '15vp', right: '15vp' })
         .borderStyle(borderStyle.solid)
         .borderWidth('1vp')
         .borderColor(color.gray);

        // 搜索按钮
        Button({ text: '搜索' })
         .onClick(() => {
            // 这里可以根据实际需求进行搜索操作,比如跳转到搜索结果页面并传递搜索参数
            router.push({
              uri: 'pages/SearchResultsPage',
              params: { searchQuery: this.searchText },
            });
          });
      }
     .alignItems(verticalAlign.center);
    }
   .width('100%');
  }
}

SearchResultsPage.ts

import { CustomDialog } from '@ohos.arkui.dialog';

@component
export struct SearchResultsPage {
  build() {
    Column() {
      Text(`搜索结果页面,搜索词:${this.$router.params.searchQuery}`)
       .fontSize(24)
       .margin({ top: 50 });

      // 可以在这里展示搜索结果列表等内容

      Button({ text: '返回' })
       .onClick(() => {
          router.back();
        });
    }
   .width('100%');
  }
}

你可以根据实际情况调整和扩展这个示例,以满足你的具体需求。这个示例展示了一个简单的搜索组件,包括输入框和搜索按钮,点击搜索按钮后会跳转到搜索结果页面并传递搜索词作为参数。在搜索结果页面可以展示根据搜索词获取的结果。

### 小程序开发中自定义封装全局组件的方法 在小程序开发中,为了提高代码的复用性和维护性,通常会将一些通用的功能模块封装组件,尤其是全局组件。全局组件可以在多个页面中重复使用,避免重复开发,提升开发效率。 #### 1. 全局组件的定义与创建 在微信小程序中,全局组件是指在整个小程序中都可以被调用的组件。要创建一个全局组件,首先需要在 `app.json` 文件中进行声明。具体步骤如下: - **定义全局组件**:在 `app.json` 文件中,通过 `usingComponents` 字段声明全局组件,并指定组件的路径。例如: ```json { "usingComponents": { "global-component": "/components/global-component/global-component" } } ``` - **使用全局组件**:在任意页面的 WXML 文件中,直接使用自定义标签 `<global-component>` 来引用全局组件,并传递数据给组件。例如: ```xml <global-component title="全局组件示例" /> ``` #### 2. 全局组件的数据通信 全局组件与其他组件之间的数据通信可以通过 `properties` 和事件机制来实现。 - **接收父组件数据**:在组件的 JS 文件中,通过 `properties` 属性定义组件可以接收的外部数据。例如: ```javascript Component({ properties: { title: { type: String, value: '默认标题' } } }); ``` - **向父组件发送数据**:通过 `this.triggerEvent` 方法触发自定义事件,向父组件传递数据。例如: ```javascript this.triggerEvent('customEvent', { detail: '组件内部数据' }); ``` #### 3. 全局组件封装技巧 为了确保全局组件能够在不同页面中灵活使用,建议采用以下封装技巧: - **统一接口设计**:为组件提供统一的输入输出接口,确保组件在不同场景下的兼容性。 - **样式隔离**:使用 `styleIsolation` 属性来隔离组件的样式,防止样式污染。例如: ```javascript Component({ options: { styleIsolation: 'isolated' } }); ``` - **动态加载**:对于某些复杂的全局组件,可以考虑按需加载,减少初始加载时间。例如,使用 `require` 动态引入组件: ```javascript const componentPath = require('./dynamic-component'); ``` #### 4. 适配不同平台的全局组件 在 uni-app 中,由于不同平台(如 H5、微信小程序、App)的差异,直接使用 `document.body.appendChild` 插入组件节点的方式并不适用。因此,可以采用以下方法来封装全局组件: - **H5 端**:可以直接通过 `document.body.appendChild` 挂载组件。 - **微信小程序和 App 端**:可以在 SFC 模板中指定位置插入自定义内容,确保组件能够在所有页面中弹出。例如,使用 `v-if` 控制组件的显示与隐藏: ```vue <template> <view> <global-modal v-if="showModal" :content="modalContent" @close="closeModal" /> </view> </template> ``` - **封装全局 API**:可以通过封装一个全局 API 来调用弹窗组件,类似于 `uni.showModal` 的方式。例如: ```javascript function showModal(content) { // 实现弹窗逻辑 } export default { showModal }; ``` #### 5. 全局组件的应用场景 全局组件适用于多种应用场景,如: - **弹窗提示**:用于显示通用的提示信息或操作确认框。 - **导航栏**:用于多个页面共用的顶部导航栏。 - **底部菜单**:用于多个页面共用的底部操作菜单。 通过合理封装和使用全局组件,可以显著提升小程序的开发效率和用户体验。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值