•  


GitHub - Wscats/openharmony-sheet: ???零?始使用???蒙 OpenHarmony ??游?和表格渲染引擎
Skip to content

Wscats/openharmony-sheet

Repository files navigation

背景

?着 OpenHarmony ?件??大??果公布,我?的??成?被告知?得了二等?,在?心之余也想?我??段????的?????下??大家分享,?我?看到??通知的?候已?是 9 月中旬的?候,此?已?是作品可以提交的??了,?考了一些其他作品??,基于 Canvas ??的?件目前??有,那我?就?始???一?基于 Canvas 和通用?件一起??的?件,在?之前由于??有??? OpenHarmony ?用,我???成?都?有相?的??,大家?零?始在摸索,我?首先分工合作,有的成???去下? IDE 和????,有的成????究和??官方文?。

配置

在??完官方文?之后,我?成?分?在自己本地??和??上做了以下的?境配置:

  1. 下??安?好 DevEco Studio 2.1 Release 及以上版本
  2. ?取 OpenHarmony SDK 包?解?
  3. 配置 OpenHarmony SDK

DevEco 主界面,点?工具?中的 File > Settings > Appearance & Behavior > System Settings > HarmonyOS SDK 界面,点? HarmonyOS SDK Location 加? SDK

然后一直点? Next Finish 完成?境配置。

  1. 安??外包,?入 OpenHarmony-SDK-2.0-Canary/js/2.2.0.0/build-tools/ace-loader 目?,然后在?目?下?行命令行工具,分??行如下命令,直至安?完成
npm cache clean -f
npm install
  1. 下? OpenHarmonyJSDemos ?目工程,?工程?入 DevEco Studio
  2. 申??配置??,注意 OpenHarmony ? HarmonyOS 的??不通用,所以需要?外?行申?
  3. ?行???建,生成一? HAP ?用安?包,生成 HAP ?用安?包,安?到 OpenHarmony ??板
  4. 安??行后,在??板?幕上点??用???可打??用,?可在??上?看?用示例?行效果,以及?行相???
  5. 除了使用?机??,我??可以使用?程??和本地的 Previewer ??,?然非常相?方便,但??表?肯定和?机是有稍微差?的

前言

在?? Canvas ?用之前,我???一些商量和??,首先是希望能借助?一次??提升? OpenHarmony 的理解,方便后???的支持,其次我???成?也是希望能拿到比?好的名次和??,我?注意到比?的?分由?委打分,?分? 100 分,?里?根据作品的?意性、?用性、用???、代??范等四??度点?打分, Canvas 的?用首先??成本?比普通?用?度稍微大点,?且不好??,在?意性和?用性上我???不大,因?大部分前端??者接?到的 Canvas ?用都是游?相?的,所以??路注定是?相???的,用???也是一??大的?点,我??机???? Canvas 的表?也不是?好,比原生一些?件的??差?多,?于??成?的代??量是有信心的,但是代??范的?分比重却是最少的,所以在立?的?候我?有比?大的分?。

???度 ?明 分?
?意性 作品的?新程度 30%
?用性 作品在?用?景中的???用程度 30%
用??? 用???价?,用?能??松使用?件,??得良好??感 25%
代??范 代?的?量,美?度,是否符合?范 15%

??

正因?由上面??的疑?,我?先制定了三???和一?目?:

渲染引擎是我?最?目?,?然?度偏大,但我???成??定分?三步????目?,首先至少先??使用基??件和容器?件,然后再??使用?布?件,最后?合?些????一?渲染引擎。

初??

我?首先??了一?通用的?廊?件?作??手?目,?主要使用了四?基??件和容器?件:

我?放置一?按???? showGallery 方法,?方法控制 panel ?出式?件的?示和?藏,?里的 div button ??就是 hml ?置的?件,?我?平常? html ?相似,?支持我?大部分的常??性如 id class type 等,方便我?用??置?件基本??和外?特征?示。

<
div
 class
="
btn-div
"
>

  <
button
 type
="
capsule
" 
value
="
Click Here
" 
onclick
="
showGallery
"
>
</
button
>

</
div
>

然后我? panel ?件中放置可?更的?廊?容展示?口,?? mode src ?成可?置的?量,???廊?件就能根据模式??廊?件?示不同的形?,根据?入的?片地址?示不同的?片?容,?里的?法?微信小程序?和 Vue ?架相似,都可以使用 Mustache ?法?控制?性?。

<
panel

  id
="
gallery
"
  
class
="
gallery
"
  
type
="
foldable
"
  
mode
="
{{modeFlag}}}
"
  
onsizechange
="
changeMode
"
>

  <
div
 class
="
panel-div
" 
onclick
="
closeGallery
"
>

    <
image
 class
="
panel-image
" 
onclick
="
closeGallery
" 
src
="
{{galleryUrl}}}
"
>
</
image
>

    <
button

      class
="
panel-circle
"
      
onclick
="
closeGallery
"
      
type
="
circle
"
      
icon
="
/common/images/close.svg
"
    
>
</
button
>

  </
div
>

</
panel
>

??完??和布局之后,我?就可以在同?目?下 index.js 中?充?廊?件的??,由于支持 ES6 ?法,我??的也?舒服?高效,?里的 data 是?廊?件的?据模型,?型可以是?象或者函?,如果?型是函?,返回?必?是?象,注意?性名不能以 $ _ ??,不要使用保留字,我?在?里? modeFlag galleryUrl ?置默??。

export
 default
 {

  data
: 
{

    modeFlag
: 
"full"
,

    galleryUrl
:
      
"https://pic1.zhimg.com/v2-3be05963f5f3753a8cb75b6692154d4a_1440w.jpg?source=172ae18b"
,

  }
,

}
;

而?示和?藏??比???,只需要?取 panel 的?点,然后?? show 或者 hide 方法?可,?然除了?方法,我??可以使用 渲染?性 ???:

  • for 根据?置的?据列表,展??前元素
  • if 根据?置的 boolean ?,添加或移除?前元素
  • show 根据?置的 boolean ?,?示或?藏?前元素
showGallery
(
e
)
 {

    this
.
$element
(
'gallery'
)
.
show
(
)

}
,

closeGallery
(
e
)
 {

    if
(
e
.
target
.
type
===
'image'
)
 return

    this
.
$element
(
'gallery'
)
.
close
(
)

}
,

我??可以在同?目?下在 index.css ?充?件的?式,可以?我?的?廊呈?更好的效果,?里???式?支持??的旋?、平移、?放和??效果,均可在 style css 中?置。

.
panel-div
 {
  
width
:
 100
%
;
  
height
:
 100
%
;
  
flex-direction
:
 column;
  
align-items
:
 center;
  
justify-content
:
 center;
}

整???的效果如下?所示,效果??粗暴,?完了?? DEMO 之后,我???成?? OpenHarmony 的基??件?用有了最基本的了解:



??

?然上面我?掌握了最基?的?件使用,但我??是?使用到 Canvas ?布?件,所以我?????官方文?,?? OpenHarmony 是提供了?全的?布接口:

我?使用?典 FlappyBird 游?作?我??布?件的第一次??。

收集素材

首先我?先准?好游?的?片和??素材:

素材
背景
小?
地面
水管

然后我?准?好?布,?置好高度和?度,????布按下的方法 ontouchend

<
div
 class
="
container
"
>

  <
canvas
 ref
="
canvas
" 
style
="
width: 280px; height: 512px;
" 
ontouchend
="
moveUp
"
>
</
canvas
>

</
div
>

?据初始化

准?好?布之后,我?就需要初始化游?的初始?据,核心的主要涉及??:

el ?布元素
gap 管道?距
score 得分
bX 小? X ?坐?
bY 小? Y ?坐?
gravity 重力指?
pipe 管道?据
birdHeight 小?高度
birdWidth 小??度
pipeNorthHeight 上?管道高度
pipeNorthWidth 下?管道高度
cvsHeight ?布高度
cvsWidth ?布?度
fgHeight 地面高度
fgWidth 地面?度

????游?之前,我?不但需要掌握基?的?件,?需要了解一部分生命周期, OpenHarmony 有??生命周期,分?是?用生命周期和?面生命周期,我??里第一次?用到生命周期 onShow ,?是在?面打?的?候??,?且?用?于前台???,我?需要?在?始的?候?我?初始化一些???据,?取?布的?点,保存?布的上下文作用域 ctx ,?空管道?据和??游???制。

onShow
(
)
 {

    this
.
el
 =
 this
.
$refs
.
canvas
;

    this
.
ctx
 =
 this
.
el
.
getContext
(
'2d'
)
;

    this
.
pipe
[
0
]
 =
 {

        x
: 
this
.
cvsWidth
,

        y
: 
0
,

    }
;

    requestAnimationFrame
(
this
.
draw
)
;

}
,

?里的 this.draw 方法是整?游?的核心??,涉及小?的?行??,???迹,?界?理和得分?算。

首先我???布的左上角 X Y ?的起始位置?始?制游?的背景。

const
 ctx
 =
 this
.
ctx
;

ctx
.
drawImage
(
this
.
bg
,
 0
,
 0
)
;

然后我??制小??行?程中出?在天空和地面的管道,?里需要?算天空的管道位置,上管道的位置需要用??管道??的?距加上下管道的高度的出?的,?位置?算出?后,只需要配合定?器或者 requestAnimationFrame ???更新管道和?的位置就能?用?感知游????面的效果,?里我使用了 requestAnimationFrame ?求??????更好,但是?? API Version 6 才?始支持,?且不需要??入,所以?者需要留意?的 SDK 是否是比?新的版本。

for
 (
let
 i
 =
 0
;
 i
 <
 this
.
pipe
.
length
;
 i
++
)
 {

  this
.
constant
 =
 this
.
pipeNorthHeight
 +
 this
.
gap
;

  ctx
.
drawImage
(
this
.
pipeNorth
,
 this
.
pipe
[
i
]
.
x
,
 this
.
pipe
[
i
]
.
y
)
;

  ctx
.
drawImage
(
this
.
pipeSouth
,
 this
.
pipe
[
i
]
.
x
,
 this
.
pipe
[
i
]
.
y
 +
 this
.
constant
)
;

  this
.
pipe
[
i
]
.
x
--
;

}

?撞??

?里我?使用一??件判??做?界?理??撞??,也就是小?如果?到地面,?到天空的管道或者地面的管道就?使所有??停止,?游??束,如果游??束??算成?,?且使用 OpenHarmony ?置的??提醒玩家是否需要重新?始新的游?。

if
 (

  (
this
.
bX
 +
 this
.
birdWidth
 >=
 this
.
pipe
[
i
]
.
x
 &&

    this
.
bX
 <=
 this
.
pipe
[
i
]
.
x
 +
 this
.
pipeNorthWidth
 &&

    (
this
.
bY
 <=
 this
.
pipe
[
i
]
.
y
 +
 this
.
pipeNorthHeight
 ||

      this
.
bY
 +
 this
.
birdHeight
 >=
 this
.
pipe
[
i
]
.
y
 +
 this
.
constant
)
)
 ||

  this
.
bY
 +
 this
.
birdHeight
 >=
 this
.
cvsHeight
 -
 this
.
fgHeight

)
 {

  prompt
.
showDialog
(
{

    buttons
: 
[
{
 text
: 
"重?一次"
 }
]
,

    success
: 
(
data
)
 =>
 this
.
restart
(
)
,

  }
)
;

  clearInterval
(
this
.
interval
)
;

}

??理完?界,我??需要?理?小?一直?下去的?候,要不??建新的管道,回收?管道算得分,????也相?之??,本?上也算是一??撞??,?管道位置?更到?面左? X ?? 5 的位置,?小?已?安全通?,?成功得分,?最新的管道?更到?面右? X ?? 125 的位置,?小??要??的下一?管道,?提前?建好下一?新的管道,如果小???的距?比??,我??需要考??化管道??,不能???无限制的增?下去,我??可以?化,所以??管道已?完全消失在?面中的?候,我?可以考?把?管道的?据???中?除。

if
 (
this
.
pipe
[
i
]
.
x
 ==
 125
)
 {

  this
.
pipe
.
push
(
{

    x
: 
this
.
cvsWidth
,

    y
: 
Math
.
floor
(
Math
.
random
(
)
 *
 this
.
pipeNorthHeight
)
 -
 this
.
pipeNorthHeight
,

  }
)
;

}

if
 (
this
.
pipe
[
i
]
.
x
 ==
 5
)
 {

  this
.
score
++
;

}

上面所有的?些??本?都是?制管道的??,我?配合偏移量和重力因素,??易的就能?制出小?的?行?迹,我??里??便把得分?制到?幕的左下角,以便??展示玩家得分。

ctx
.
drawImage
(
this
.
fg
,
 0
,
 this
.
cvsHeight
 -
 this
.
fgHeight
)
;

ctx
.
drawImage
(
this
.
bird
,
 this
.
bX
,
 this
.
bY
)
;

this
.
bY
 +=
 this
.
gravity
;

ctx
.
fillStyle
 =
 "#000"
;

ctx
.
font
 =
 "20px Verdana"
;

ctx
.
fillText
(
"Score : "
 +
 this
.
score
,
 10
,
 this
.
cvsHeight
 -
 20
)
;

操作和?分

而我?玩家??整?游?只需要一?操作,就是用手指点??幕,?量?小?安全??管道之?,所以我?需要???幕的点?事件,本?也就是?布的点?事件,?用?点?一下的?候,我?就?小?往上方移?一点距?。

moveUp
(
)
 {

    this
.
bY
 -=
 25
;

}
,

而重置游??初始化的???相似,只要把玩家得分,?的位置和管道的?据全部恢?到默????可:

restart
(
)
 {

    this
.
pipe
 =
 [
]
;

    this
.
pipe
[
0
]
 =
 {

        x
: 
this
.
cvsWidth
,

        y
: 
0
,

    }
;

    this
.
constant
 =
 0
;

    this
.
score
 =
 0
;

    this
.
bY
 =
 150
;

}
,

封??件

由于比?要求我?是??一?通用?件,所以在案例 2 中我?希望更?一步,??把??把??游?封?成一?通用的?件,??官方文?????起????,?情在 自定??件 ,所?自定??件就是是用?根据??需求,?已有的?件?合,封?成的新?件,可以在工程中多次?用,?而提高代?的可?性。?上所述,我?只需要使用 <element> ?件把我??才??的?件引入到宿主?面?可。

<
element
 name
="
Flappy
" 
src
="
./flappy//pages//index/index.hml
"
>
</
element
>

<
div
 class
="
container
"
>

  <
Flappy
>
</
Flappy
>

</
div
>

??挑?

有了前面??案例的?累,我???? OpenHarmony ??有了更??的??,就要?入最后激?人心的??挑?了,我?要完整的移植一? Canvas 引擎,我?一?始考?的是??一?游?引擎,但考?到比?剩余???不足?,?且游?引擎的?用性和?意性不利于展?,所以??我????合考量,我?最??定??一?文?表格渲染引擎。

输入图片说明

思考

可能有人疑??什????移植一?文?渲染引擎,?里想起外?知乎有??似的??, 中?要用多久才能??出?似 Excel,且功能涵盖 Excel 95% 功能的替代?件? ,??路?崎????,引用最高?一些大 V 的回答?:

  • 微??子哥 :做不出?的,那?多?西,要把需求文??好都得好?年。 微?的 Belleve:各位程序?可以??先??下 recalc(根据公式更新?元格??),就知道?度了,文??目作???最??的 C++ ?目?非浪得?名。
  • 微?的妖怪弟弟 :作? Excel 的工程?,哥??的答一?,不能,因?我?隔壁?已????了,?年大?覆盖了 40%上下?。
  • IBM 的 Caspar Cui :如果是??常用的 Excel 功能的?, WPS 已?是?好的替代品了。而且微?和金山也有交叉授?。但是?要提到 95%功能的 Excel 已?做到了??事?。。。?是有点小? Excel 了。就一??助文?量,WPS 也得多努力。
  • 中科大的 Sixue :假如微??抽,把 Excel 源?弄?了,不可恢?了。那就是世界末日,大家一起完蛋。??微?把 Excel ??原班人??回?,??的反聘,英年早逝的?活,然后重新??一? Excel。他也??法保?把 Excel 的功能恢?到 95%,?法保? 95%的 Excel 文件正常打?。
  • Bbcallen :不可能的,微?自己都做不到。

不管任何人???,??路我?也必?走,就如?蒙?生背后的意?,我???去迎接??挑?,?里面的每一?坎每一?坑都?得留下一?中?人的脚印。

?技?和目?角度理性去看,我?更????的不是已?固化了市?和用???的本地?人文?而是在??同文?,本地文?只需考??人,不需要考?多人?同?景,只需要考???,不需要考?在??景,只需要考?客?端?景,不需要考?服?器?景等...

在?文?的宿主?境是??器,本地文?背后是系?,??任何在?文?背后都?有像谷歌文?基于谷歌??器的支持,?有微? Office 基于微? Windows 系?的支持,事?上基于?一切我?也??醒??到,做到 95% 是??的。要知道谷歌?了????器前后投入了十?年上千人上百?,微? Windows 系?就更不用?了,在??我?可能?有不了??的技?背景,但我?仍在努力?小差距?强追?。

??方案

在????方案之前, 我?先??表格渲染有多?? ,表格的渲染一般??有????方案:

  • DOM 渲染。
  • Canvas 渲染。

?界比?出名的 handsontable ?源?就是基于 DOM ??渲染,同等渲染?果,需要? DOM ?点?行精心的????造,但?而易?十万、百万?元格的 DOM 渲染??生?大的性能??。因此,如今?多在?表格??都是基于 Canvas 和?加 DOM ???的,但使用 Canvas ??需要考?可??域、??操作、?布???系,也有 Canvas 自身面?的一些性能??,包括 Canvas 如何?行直出等,???的要求?高,但?了更好的用???,更?向于 Canvas 渲染的??方案。

由于大部分前端?目渲染?是使用?架根据排版模型???逐?渲染的,整?渲染?也是?排版模型?一一??。因此,整?渲染的?点也非常多。?目?大?,性能?受到?大的影?。

输入图片说明

?了提升渲染性能,提供更??的????? DOM 更?成 Canvas 渲染,方便??者?建重前端大型在?文??目, 在??外???似引擎的公司??只有?家 ,如:??文?,金山文?和谷歌文?等。

??
DOM 容器?件?入?等
Canvas 高亮??等
Canvas ?容字?背景色等
底?

我?通?分?收集??元素,再?行逐??渲染的方式,?少 Canvas ??引擎切???机的次?,降低性能?耗,?化渲染耗?,整?核心引擎代?控制在 1500 行左右,??充演示代? 500 行,方便大家理解??和?行二次??。

?里移植的引擎主要?考了一?商??目和一??源?目:

?布初始化

我??造一? table ?,在初始化的?候?建?布,??置好高度和?度,?放入 DOM 中,?把常用的???到原型?上?暴露到全局 window ?量上。

class
 Table
 {

  constructor
(
container
,
 width
,
 height
)
 {

    const
 target
 =
 document
.
createElement
(
"canvas"
)
;

    document
.
querySelector
(
container
)
.
appendChild
(
target
)
;

    this
.
$target
 =
 target
;

    this
.
$draw
 =
 Canvas2d
.
create
(
target
)
;

    this
.
$width
 =
 width
;

    this
.
$height
 =
 height
;

  }

}

我?就可以,?面中在 <div id="table"></div> 放置好表格元素,全局?境中直接?例化??布,?里?件通? id ?性??后,可以使用? id ?取?件?象??用相??件方法。

const
 table
 =
 new
 Table
(
"#table"
,
 800
,
 500
)
;
左上?域 col 列 col 列
row 行 cell ?元格 cell ?元格
row 行 cell ?元格 cell ?元格

坐?系建立

有了?布,我?就要?始??渲染,我? table ?里面封? render 方法, render 方法主要?制四??域,也就是?似??上的 笛??直角坐?系 的四?想象,涉及格子?段,格子的信息,列?部(A-Z 列),行?部和???域。

2 - 左上?域 1 - 右上?域
3 -左下?域 4 - 右下?域

?些 area 都是通? area.js Area 初始化而?

  • 2 ?域至 1 ?域就是 A-Z 列?部
  • 2 ?域至 3 ?域就是行?部
  • 4 ?域最常用,是可??的?元格
renderBody
.
call
(
this
,
 draw
,
 area4
)
;

renderRowHeader
.
call
(
this
,
 draw
,
 iarea3
)
;

renderColHeader
.
call
(
this
,
 draw
,
 iarea1
)
;

renderFreezeLines
.
call
(
this
,
 draw
,
 area4
.
x
,
 area4
.
y
)
;

而??四??域大部分的核心思路本?都是?制格子,所有都共同用到 renderLinesAndCells 方法,里面分?有用于?制?域的??和格子信息的方法,里面的 renderCells ?遍??域然后?? renderCell ?制每一???的?元格,?里???理一些特殊的?元格,比如合?的?元格和?中的?元格,而 renderLines ??遍?每行每列去?制所有行列的?隔?。

function
 renderLinesAndCells
(
)
 {

  renderLines
(
draw
,
 area
,
 lineStyle
)
;

  renderCells
(
draw
,
 type
,
 area
,
 cell
,
 cellStyle
,
 selection
,
 selectionStyle
,
 merges
)
;

}

?元格渲染

?制了表格的?元格之后,就需要往每??元格渲染?据和格式了,?里在 Table 原型?上??了一? cell 方法,?接受一?回?函??把?存到???性 $cell 上,? renderCell 函???的?候就??用??方法?把行列??入 $cell 方法中?取?元格的信息。

Table
.
prototype
[
"cell"
]
 =
 function
 (
callback
)
 {

  this
[
`$$cell`
]
 =
 callback
;

  return
 this
;

}
;

const
 sheet
 =
 [

  [
"1"
,
 "1"
,
 "1"
]
,

  [
"1"
,
 "0"
,
 "1"
]
,

  [
"1"
,
 "1"
,
 "1"
]
,

]
;

table
.
cell
(
(
ri
,
 ci
)
 =>
 sheet
?.
[
ri
]
?.
[
ci
]
 ||
 ""
)
.
render
(
)
;

所以我?可以通?暴露的 $cell 方法控制每??元格的文字信息和?元格?式,?然?里支持?只?入?文本,也支持??入???据??????元格,?里的 style ?有默?的??自于 $cellStyle

bgcolor #ffffff
align left
valign middle
textwrap true
underline false
color #0a0a0a
bold false
italic false
rotate 0
fontSize 9
fontName Source Sans Pro

?些?式本?是使用 Canvas 提供的接口 draw.attr() ?展示的。

const
 c
 =
 cell
(
ri
,
 ci
)
;

let
 text
 =
 c
.
text
 ||
 ""
;

let
 style
 =
 c
.
style
;

cellRender
(
draw
,
 text
,
 cellRect
,
 style
)
;

有上面最基?的方法,我?已??有表格?据展示的功能,此?我?可以暴露更?富的接口?第三方使用,比如常用的合??元格,我??用 merges 方法告知 table ?,我?在 X ? G9 H11 Y ? B9 D11 的范?里面的?元格是被合?的??,

Table
.
create
(
"#table"
,
 800
,
 500
)
.
merges
(
[
"G9:H11"
,
 "B9:D11"
]
)
;

那此? renderCells 就????域的格子做特殊的?理,把?渲染成合??元格的??。

eachRanges
(
merges
,
 (
it
)
 =>
 {

  if
 (
it
.
intersects
(
area
)
)
 {

    renderCell
(
draw
,
 it
.
startRow
,
 it
.
startCol
,
 cell
,
 area
.
rect
(
it
)
,
 cellStyle
)
;

  }

}
)
;

?据可??

除了?元格合?,常用的?有?布的事件?理,因??才所有的方法都只是表格只?看??,表格??被用?所??,所以就得??用?点?和?入的事件,所以我?在表格渲染的?候?定了 click mousedown mousemove mouseup 事件等,我?可以通???用?点?行?,在??的?元格的?布的上方,? DOM 元素 Z ??示?入?,?用?提供?入修改?元格功能。

bind
(
$target
,
 "click"
,
 (
evt
)
 =>
 {
}
)
;

bind
(
$target
,
 "mousedown"
,
 (
evt
)
 =>
 {
}
)
;

所以在 DOM ?点中我?除了放 <canvas> 元素,?可以安排上 <textarea> 元素,?里可以留意到我????式中有 areaTop areaLeft ?控制我??入?的具?位置,??位置?取也是非常容易,我?只需要拿到点?事件?象 evt.offsetX evt.offsetY ,然后根据坐?的位置算出是否在四?象限?域里面?返回所在的行列信息,?合行列的信息就可以准?算出?入?的偏移? areaTop areaLeft ,然后再??入?切??可?示的??,用?就可以在表格的???元格上看到?入?。

<
div

  if
=
"{{isShowArea}}"

  style
=
"width: 100px; height: 25px; top: {{areaTop}}px; left: {{areaLeft}}px"

>

  <
textarea

    if
=
"{{isShowArea}}"

    focus
=
"{{isFocus}}"

    value
=
"{{content}}"

    selectchange
=
"change"

    onchange
=
"change"

  >
<
/
textarea
>

<
/
div
>

有了?入?我?就可以??用?的?入操作,我?把?入事件?定在 textarea ?件上,??件?到事件???件?,??行 JS 中??的事件回?函?,???面 UI ??和?面 JS ???的交互,事件回?函?中通???可以携??外的信息,如?件上的?据?象 dataset 事件特有的回???,??件??事件后,事件回?函?默??收到一?事件?象,通??事件?象可以?取相?的信息,我?通?事件?象得到用??入的?,??用 cell 方法重新更新表格里面???元格的?,?然??情?有?候比???,比如用?是修改?元格文字的?色,所以?里?判??据格式。

textarea
.
addEventListener
(
"input"
,
 (
e
)
 =>
 {

  let
 input
 =
 e
.
target
.
value
;

  table
.
cell
(
(
ri
,
 ci
)
 =>
 {

    if
 (
ri
 ===
 row
 &&
 ci
 ===
 col
)
 {

      return
 (
window
.
data
[
ri
]
[
ci
]
 =

        typeof
 value
 ===
 "string"
 ||
 typeof
 value
 ===
 "number"

          ? 
input

          : 
{
 ...
value
,
 text
: 
input
 }
)
;

    }

    return
 window
.
data
[
ri
]
[
ci
]
;

  }
)
;

}
)
;

下?是我??机的??效果,可以看到我?引入了?置? @system.prompt ,点???的?元格???示??的行列信息,方便我?????,我?使用手机的?置?入法?入?容??,?入??准??取到信息?更新到表格上,而使用 IDE ?置的 Previewer ???无效,猜?是 PC 端??的?入事件?有被??。

工具???

有了最基本的?看和??表格的功能,下一步我?就可以考???工具?了,工具?的??,一般?提供?置行列高度,文本加粗,居中,斜?,下??和背景色等?置,其?就是上面?元格 style 方法配合行列位置或者范?信息的再封?各?接口??。

我??里介???常用的, colHeader 可以?置?的列表行?和其高度,如果?不???行??,他也?有默?的高度。

table
.
colHeader
(
{
 height
: 
50
,
 rows
: 
2
 }
)
.
render
(
)
;

某些情?,我?在??表格的?候,我?可能需要固定某些行和某些列的?元格?提高表格??性,此? .freeze 就可以派上用?,以下?置?????? C6 以?的列。

table
.
freeze
(
"C6"
)
.
render
(
)
;

scrollRows 一般配合???域使用,????域以外的??可以做??操作。

table
.
scrollRows
(
2
)
.
scrollCols
(
1
)
.
render
(
)
;

我?可以使用以下方法更新?元格第二行第二列的?据? 8848 ,?色??色:

table

  .
cell
(
(
ri
,
 ci
)
 =>
 {

    if
 (
ri
 ===
 2
 &&
 ci
 ===
 2
)
 {

      return
 {

        text
: 
"8848"
,

        style
: 
{

          color
: 
"red"
,

        }
,

      }
;

    }

    return
 this
.
sheet
?.
[
ri
]
?.
[
ci
]
 ||
 ""
;

  }
)

  .
render
(
)
;

由于可?置?元格的形式太多了,?里不一一展?,具?可以?考以下接口,支持各??富的多?的改?,可以看出?其??我??置 CSS ?式是?相似的:

{

  cell
: 
{

    text
,

    style
: 
{

      border
,
 fontSize
,
 fontName
,

      bold
,
 italic
,
 color
,
 bgcolor
,

      align
,
 valign
,
 underline
,
 strike
,

      rotate
,
 textwrap
,
 padding
,

    }
,

    type
: 
text
 |
 button
 |
 link
 |
 checkbox
 |
 radio
 |
 list
 |
 progress
 |
 image
 |
 imageButton
 |
 date
,

  }

}

我??上面常?的接口做了一些演示,?行 OpenHarmonySheet ?按 任一?元格?出 ??? ?点??????可?看常用接口的?行?果,此演示?供?考,更多??使用?景??考文???:



生命周期和事件

在完成上面上述的功能之后,我?就需要考?暴露生命周期和事件?封?成一?通用?件?接入方使用。

  • @sheet-show 表格?示
  • @sheet-hide 表格?藏
  • @click-cell-start ?元格点?前
  • @click-cell-end ?元格点?后
  • @click-cell-longpress ?按表格
  • @change 修改?元格?据

由于 OpenHarmony ?自定??件提供了一系列生命周期回?方法,便于??者管理自定??件的?部??。生命周期主要包括: onInit onAttached onDetached onLayoutReady onDestroy onPageShow onPageHide 。我?的表格?件可以利用各?生命周期回?的?机暴露自身的生命周期。

this
.
$emit
(
"eventName"
,
 data
)
;

?里 name ?性指自定??件名?,?件名??大小?不敏感,默?使用小?。 src ?性指自定??件 hml 文件路?,如果?有?置 name ?性,?默?使用 hml 文件名作??件名。而自定??件中?定子?件事件使用 onXXX @XXX ?法,子?件中通? this.$emit ??事件??行??,通??定的自定?事件向上????,父?件?行 bindParentVmMethod 方法?接收子?件??的??。

<
element
 name
="
Sheet
" 
src
="
../../components/index.hml
"
>
</
element
>

<
Sheet

  sheet
="
{{sheet}}
"
  
@sheet-show
="
sheetShow
"
  
@sheet-hide
="
sheetHide
"
  
@click-cell-start
="
clickCellStart
"
  
@click-cell-end
="
clickCellEnd
"
  
@click-cell-longpress
="
clickCellLongpress
"
  
@change
="
change
"
>
</
Sheet
>

我?把上面?些通通打包,?完善了介?文?和接入文?上?到 Gitee - OpenHarmonySheet ??中,就完成了我?的表格引擎?件。

回?整??程?然有?度有挑?,但我????是的群策群力解?了,在整?比??程中我???也??了?多?于?蒙的?西,在以前一直?有??机?去了解,借着?次比?的机?能重新???蒙,也??了一些志同道合的??者,?且做????,作品在??前要?准一?方向,最好是???域自己熟悉的,?且?其他??作品是不重合的,???自己的作品是??,??人的作品是友好,?比?也是尊重的,在把握好方向之后就要制定每一?小??和最?的目?,做好前中后期的具???,步子不能跨地太大,不能好高??,要脚踏?地的去完成每一?小??,???程?于??和自己都是??的,?然我?不一定能到??点,但回?看我?每一?脚印都是自己努力的回?,??成?之?要??,有??性地完成好每一?任?,????,互相?忙,共同?步,正如?蒙所??的一?,一?完善的系?需要千万??者?心?力一起去?建和打磨,希望能有越?越多好的 OpenHarmony ?源?目,不??步,无以至千里,不?小流,无以成江海,一起去打造?于我?的生?。

最后衷心希望 OpenHarmony 能?展的越?越强大,越?越?利,??路?然??,但?得,??破浪?有?,直?云帆??海!

- "漢字路" 한글한자자동변환 서비스는 교육부 고전문헌국역지원사업의 지원으로 구축되었습니다.
- "漢字路" 한글한자자동변환 서비스는 전통문화연구회 "울산대학교한국어처리연구실 옥철영(IT융합전공)교수팀"에서 개발한 한글한자자동변환기를 바탕하여 지속적으로 공동 연구 개발하고 있는 서비스입니다.
- 현재 고유명사(인명, 지명등)을 비롯한 여러 변환오류가 있으며 이를 해결하고자 많은 연구 개발을 진행하고자 하고 있습니다. 이를 인지하시고 다른 곳에서 인용시 한자 변환 결과를 한번 더 검토하시고 사용해 주시기 바랍니다.
- 변환오류 및 건의,문의사항은 juntong@juntong.or.kr로 메일로 보내주시면 감사하겠습니다. .
Copyright ⓒ 2020 By '전통문화연구회(傳統文化硏究會)' All Rights reserved.
 한국   대만   중국   일본