คอมโพเนนต์ของแอปขนาดเล็ก

คอมโพเนนต์เว็บ

คอมโพเนนต์เว็บเริ่มต้นขึ้นด้วยสัญญาว่าจะให้นักพัฒนาซอฟต์แวร์นำมาประกอบเข้าด้วยกันและสร้างแอปที่ยอดเยี่ยมได้ ตัวอย่างคอมโพเนนต์อะตอม เช่น time-elements ของ GitHub, web-vitals-element ของ Stefan Judis หรือปุ่มเปิด/ปิดโหมดมืดของ Google อย่างไรก็ตาม เราพบว่าผู้คนมักเลือกใช้ชุดคอมโพเนนต์ที่สอดคล้องกันจากผู้ให้บริการรายเดียวกันเมื่อพูดถึงระบบการออกแบบที่สมบูรณ์ ตัวอย่างบางส่วน ได้แก่ คอมโพเนนต์เว็บ UI5 ของ SAP, องค์ประกอบ Polymer, องค์ประกอบของ Vaadin, FAST ของ Microsoft, คอมโพเนนต์เว็บ Material, คอมโพเนนต์ AMP และอื่นๆ อีกมากมาย อย่างไรก็ตาม นักพัฒนาแอปจํานวนมากก็หันมาใช้เฟรมเวิร์กอย่าง React, Vue.js, Ember.js ฯลฯ แทนที่จะให้อิสระแก่นักพัฒนาแอปในการเลือกจากตัวเลือกเหล่านี้ (หรือบังคับให้นักพัฒนาแอปเลือกเทคโนโลยี ขึ้นอยู่กับมุมมองของคุณ) ผู้ให้บริการแอปซูเปอร์ได้จัดหาชุดคอมโพเนนต์ที่นักพัฒนาแอปต้องใช้

คอมโพเนนต์ในมินิแอป

คุณสามารถคิดว่าคอมโพเนนต์เหล่านี้เหมือนกับไลบรารีคอมโพเนนต์ที่กล่าวถึงข้างต้น หากต้องการดูภาพรวมของคอมโพเนนต์ที่ใช้ได้ ให้เรียกดูคลังคอมโพเนนต์ของ WeChat, คอมโพเนนต์ของ ByteDance, คอมโพเนนต์ของ Alipay, คอมโพเนนต์ของ Baidu และคอมโพเนนต์ของ Quick App

ก่อนหน้านี้ เราแสดงให้เห็นว่าแม้ว่า <image> ของ WeChat จะเป็นคอมโพเนนต์เว็บที่ทำงานอยู่เบื้องหลัง แต่คอมโพเนนต์เหล่านี้ไม่ได้เป็นคอมโพเนนต์เว็บทั้งหมดในทางเทคนิค คอมโพเนนต์บางอย่าง เช่น <map> และ <video> จะแสดงผลเป็นคอมโพเนนต์ในตัวของระบบปฏิบัติการที่วางซ้อนกันเหนือ WebView นักพัฒนาแอปจะไม่เห็นรายละเอียดการใช้งานนี้ แต่จะได้รับการเขียนโปรแกรมให้เหมือนกับคอมโพเนนต์อื่นๆ

และเช่นเคย รายละเอียดจะแตกต่างกันไป แต่แนวคิดในการเขียนโปรแกรมโดยรวมจะเหมือนกันกับผู้ให้บริการ Super App ทั้งหมด แนวคิดที่สำคัญคือการเชื่อมโยงข้อมูลดังที่แสดงก่อนหน้านี้ในภาษามาร์กอัป โดยทั่วไปแล้ว ระบบจะจัดกลุ่มคอมโพเนนต์ตามฟังก์ชัน เพื่อให้คุณค้นหาคอมโพเนนต์ที่เหมาะสมกับงานได้ง่ายขึ้น ด้านล่างนี้คือตัวอย่างการจัดหมวดหมู่ของ Alipay ซึ่งคล้ายกับการรวมคอมโพเนนต์ของผู้ให้บริการรายอื่นๆ

  • ดูคอนเทนเนอร์
    • view
    • swiper
    • scroll-view
    • cover-view
    • cover-image
    • movable-view
    • movable-area
  • เนื้อหาพื้นฐาน
    • text
    • icon
    • progress
    • rich-text
  • องค์ประกอบของแบบฟอร์ม
    • button
    • form
    • label
    • input
    • textarea
    • radio
    • radio-group
    • checkbox
    • checkbox-group
    • switch
    • slider
    • picker-view
    • picker
  • การนำทาง
    • navigator
  • คอมโพเนนต์สื่อ
    • image
    • video
  • แคนวาส
    • canvas
  • แผนที่
    • map
  • คอมโพเนนต์แบบเปิด
    • web-view
    • lifestyle
    • contact-button
  • การช่วยเหลือพิเศษ
    • aria-component

ด้านล่างนี้คุณจะเห็น <image> ของ Alipay ที่ใช้อยู่ในคำสั่ง a:for (ดูการแสดงผลรายการ) ซึ่งวนซ้ำอาร์เรย์ข้อมูลรูปภาพที่ระบุไว้ใน index.js

/* index.js */
Page({
  data: {
    array: [
      {
        mode: "scaleToFill",
        text: "scaleToFill",
      },
      {
        mode: "aspectFit",
        text: "aspectFit",
      },
    ],
    src: "https://images.example.com/sample.png",
  },
  imageError(e) {
    console.log("image", e.detail.errMsg);
  },
  onTap(e) {
    console.log("image tap", e);
  },
  imageLoad(e) {
    console.log("image", e);
  },
});
<!-- index.axml -->
<view class="page">
  <view class="page-section" a:for="{{array}}" a:for-item="item">
    <view class="page-section-demo" onTap="onTap">
      <image
        class="image"
        mode="{{item.mode}}"
        onTap="onTap"
        onError="imageError"
        onLoad="imageLoad"
        src="{{src}}"
        lazy-load="true"
        default-source="https://images.example.com/loading.png"
      />
    </view>
  </view>
</view>

โปรดสังเกตการเชื่อมโยงข้อมูลของ item.mode กับแอตทริบิวต์ mode, src กับแอตทริบิวต์ src และตัวแฮนเดิลเหตุการณ์ 3 รายการ onTap, onError และ onLoad กับฟังก์ชันที่มีชื่อเดียวกัน ดังที่แสดงก่อนหน้านี้ แท็ก <image> จะได้รับการแปลงเป็น <div> ภายใน โดยมีตัวยึดตําแหน่งของขนาดสุดท้ายของรูปภาพ การโหลดแบบ Lazy Loading (ไม่บังคับ) แหล่งที่มาเริ่มต้น ฯลฯ

ตัวเลือกการกำหนดค่าที่มีของคอมโพเนนต์ระบุไว้ในเอกสารประกอบ ตัวอย่างคอมโพเนนต์พร้อมเครื่องจำลองที่ฝังอยู่ในเอกสารช่วยให้คุณเห็นภาพโค้ดได้ทันที

เอกสารคอมโพเนนต์ของ Alipay ที่มีการแสดงตัวอย่างคอมโพเนนต์ที่ฝังอยู่ แสดงเครื่องมือแก้ไขโค้ดพร้อมเครื่องมือจำลองที่แสดงคอมโพเนนต์ที่แสดงผลใน iPhone 6 จำลอง
เอกสารประกอบเกี่ยวกับคอมโพเนนต์ Alipay พร้อมตัวอย่างคอมโพเนนต์ที่ฝัง
ตัวอย่างคอมโพเนนต์ Alipay ที่ทำงานในแท็บเบราว์เซอร์แยกต่างหากซึ่งแสดงเครื่องมือแก้ไขโค้ดที่มีเครื่องจำลองที่แสดงคอมโพเนนต์ที่ผ่านการจัดการแสดงผลบน iPhone 6 จำลอง
ตัวอย่างคอมโพเนนต์ Alipay จะปรากฏขึ้นในแท็บของตัวเอง

คอมโพเนนต์แต่ละรายการยังมีคิวอาร์โค้ดที่สแกนด้วยแอป Alipay ที่เปิดตัวอย่างคอมโพเนนต์เป็นตัวอย่างสั้นๆ แบบจบในตัวได้อีกด้วย

แสดงตัวอย่างคอมโพเนนต์ &quot;รูปภาพ&quot; ของ Alipay ในอุปกรณ์จริงหลังจากสแกนคิวอาร์โค้ดในเอกสารประกอบ
ตัวอย่างคอมโพเนนต์ <image> ของ Alipay ในอุปกรณ์จริงหลังจากไปที่ลิงก์คิวอาร์โค้ดจากเอกสาร

นักพัฒนาแอปสามารถข้ามจากเอกสารประกอบไปยัง IDE ของ Alipay DevTools ได้โดยตรงโดยใช้ประโยชน์จากรูปแบบ URI ที่เป็นกรรมสิทธิ์ antdevtool-tiny:// ซึ่งจะช่วยให้เอกสารสามารถลิงก์ไปยังโปรเจ็กต์แอปขนาดเล็กที่จะนำเข้าได้โดยตรง เพื่อให้นักพัฒนาซอฟต์แวร์สามารถเริ่มต้นใช้งานคอมโพเนนต์ได้ทันที

คอมโพเนนต์ที่กำหนดเอง

นอกจากการใช้คอมโพเนนต์ที่ได้จากผู้ให้บริการแล้ว นักพัฒนาซอฟต์แวร์ยังสร้างคอมโพเนนต์ที่กําหนดเองได้ด้วย แนวคิดนี้มีให้บริการสำหรับ WeChat, ByteDance, Alipay และ Baidu รวมถึง Quick App ตัวอย่างเช่น คอมโพเนนต์ที่กำหนดเองของ Baidu ประกอบด้วยไฟล์ 4 ไฟล์ที่ต้องอยู่ในโฟลเดอร์เดียวกัน ได้แก่ custom.swan, custom.css, custom.js และ custom.json

ไฟล์ custom.json หมายถึงเนื้อหาโฟลเดอร์เป็นคอมโพเนนต์ที่กําหนดเอง

{
  "component": true
}

ไฟล์ custom.swan มีมาร์กอัปและ custom.css มี CSS

<view class="name" bindtap="tap">{{name}} {{age}}</view>
.name {
  color: red;
}

ไฟล์ custom.js มีตรรกะ ฟังก์ชันวงจรของคอมโพเนนต์คือ attached(), detached(), created() และ ready() นอกจากนี้ คอมโพเนนต์ยังตอบสนองต่อเหตุการณ์ในวงจรชีวิตของหน้าเว็บได้ด้วย ได้แก่ show() และ hide()

Component({
  properties: {
    name: {
      type: String,
      value: "swan",
    },
  },
  data: {
    age: 1,
  },
  methods: {
    tap: function () {},
  },
  lifetimes: {
    attached: function () {},
    detached: function () {},
    created: function () {},
    ready: function () {},
  },
  pageLifetimes: {
    show: function () {},
    hide: function () {},
  },
});

จากนั้นนําเข้าคอมโพเนนต์ที่กําหนดเองใน index.json โดยคีย์ของการนําเข้าจะเป็นตัวกําหนดชื่อ (ในที่นี้คือ "custom") ที่คอมโพเนนต์ที่กําหนดเองจะใช้ได้ใน index.swan

{
  "usingComponents": {
    "custom": "/components/custom/custom"
  }
}
<view>
  <custom name="swanapp"></custom>
</view>

กิตติกรรมประกาศ

บทความนี้ได้รับการตรวจสอบโดย Joe Medley, Kayce Basques, Milica Mihajlija, Alan Kent และ Keith Gu