DML入門−第2部:機能テンプレートの使用
32215 ワード
DMLはJavaScriptのみを使用して動的なWebコンテンツを作成するための新しいアプローチを備えています.これはいくつかの新しいデザインパターンを可能にします.このポストは、機能テンプレートの使用を説明するでしょう.
他のフレームワークのテンプレートは短いHTMLスニペットから生成されたデザインパターンです.外部パラメータを使用してランタイム中に配置される1つ以上のHTML要素を含めることができます.DMLが動的にすべての内容を生成するので、テンプレートは機能またはクラスの使用によって提供されることができます.これを「機能テンプレート」と呼ぶ.デモとして、シンプルな電卓アプリケーションは、テンプレート関数を使用して構築されます.各ステップについて詳細に説明する.
空のHTMLページと2つの外部ライブラリが必要です.
我々のアプリケーションには、ボタンの2種類が必要です
のための黄色のボタン
オペレータ のためのグレイボタン
そこで、rb ()を使用し、さらにいくつかのプロパティを追加する2つの関数を追加します.
演算子関数は、各ボタンの後に改行BR ()を作成します.
両方の関数は、新しく生成されたボタンへのアクセスを与えるために新しく作成されたボタンへのリファレンスを返します.今、我々はキーボードを作成したい.DMLでは、この作業を行うことができます.まず、ブロックを作成します.
Cボタン( clear )は別のイベントを必要とするので、arryから作成されず、手動で事前に作成されました.
同じ手順を使用して演算子ボタンを作成します.行ボタンbr ()は、各演算子ボタンの後に必要なので、テンプレート関数演算子( s )
これはDMLの「機能テンプレート」の使用の短いデモンストレーションでした.完全なコードは以下の通りです.
他のフレームワークのテンプレートは短いHTMLスニペットから生成されたデザインパターンです.外部パラメータを使用してランタイム中に配置される1つ以上のHTML要素を含めることができます.DMLが動的にすべての内容を生成するので、テンプレートは機能またはクラスの使用によって提供されることができます.これを「機能テンプレート」と呼ぶ.デモとして、シンプルな電卓アプリケーションは、テンプレート関数を使用して構築されます.各ステップについて詳細に説明する.
シンプルな電卓アプリ
空のHTMLページと2つの外部ライブラリが必要です.
<link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
<script src="https://efpage.de/DML/DML_homepage/lib/DML-min.js"></script>
機能テンプレートは以下のように簡単です.// round button
function RB(s, color) {
const r = 30;
return button(s, "width:" + px(r) + "; height:" + px(r) + "; border-radius: 50%; background-color: " + color + "; margin: 3px;")
}
これは直径30ピクセルの丸いボタンを作ります.これは単なるボタンではなく、本物のテンプレートです.しかし、それはデモンストレーションとして機能するかもしれません.そして、異なる特性(そして、要素)がテンプレートとして機能する機能を使って結合されることができます.我々のアプリケーションには、ボタンの2種類が必要です
のための
オペレータ
そこで、rb ()を使用し、さらにいくつかのプロパティを追加する2つの関数を追加します.
// yellow button for numbers
function number(s) {
let bt = RB(s, "yellow")
bt.onmouseover = () => bt.style.backgroundColor = "orange"
bt.onmouseout = () => bt.style.backgroundColor = "yellow"
return bt
}
// gray button for operators
function operator(s) {
let bt = RB(s, "silver")
bt.onmouseover = () => bt.style.backgroundColor = "#6060FF "
bt.onmouseout = () => bt.style.backgroundColor = "silver"
br() // create line break
return bt
}
ここでは、ボタンやいくつかのイベント機能には、ホバー効果を作成するさまざまな色を適用します.CSSを使用して、同じ効果を生み出すことができました.しかし、CSSはスタイリングのみに限られていますが、私たちがテンプレートに適用する関数は、いくつかの操作上の特徴を定義することもできます(値をチェックし、データベースに何かを格納します).テンプレート関数は非常に強力であり、DOM要素へのプログラムロジックも直接適用できます.演算子関数は、各ボタンの後に改行BR ()を作成します.
両方の関数は、新しく生成されたボタンへのアクセスを与えるために新しく作成されたボタンへのリファレンスを返します.今、我々はキーボードを作成したい.DMLでは、この作業を行うことができます.まず、ブロックを作成します.
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, ".", 0]
// build number block
sidiv("", "margin-right: 10px;") // ---> create a box
i = 0
for (n of numbers) {
number(String(n)).onclick = numberClick
if (++i % 3 == 0) br() // line break after 3rd column
}
number("C").onclick = () => { op = "="; display.textContent = ""; buffer = "0" }
unselectBase() // <--- finish box
ボタンはDMLのDISC内で生成され、sidiv ()はインラインコマンドであり、インラインdivを作成し、このボックスに挿入ポイントを設定します.数字のボタンは、配列“番号”からループで作成されます.すべての3番目のボタンの後に行を挿入します.OnClickイベントを作成時にすべてのボタン(OnClick -> NumberClick ())に適用してボタンを操作します.Cボタン( clear )は別のイベントを必要とするので、arryから作成されず、手動で事前に作成されました.
同じ手順を使用して演算子ボタンを作成します.行ボタンbr ()は、各演算子ボタンの後に必要なので、テンプレート関数演算子( s )
const operators = ["+", "-", "*", "/", "="]
// Right box for operators
sidiv() // ---> create a box
for (o of operators)
operator(o).onclick = operatorClick;
unselectBase() // <--- finish box
仕上げ!我々は、インターフェイスの主要な部分を構築する17の機能ボタンを使用して2 div ';sを作成している.完全なアプリケーションでは、標準的な電卓の作法を模倣する場合は少しトリッキーな操作を評価するためにいくつかの追加のコードがあります.全文
これはDMLの「機能テンプレート」の使用の短いデモンストレーションでした.完全なコードは以下の通りです.
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<title>title</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
<script src="https://efpage.de/DML/DML_homepage/lib/DML-min.js"></script>
</head>
<body>
<script> "use strict";
let i, n, o, v, history, display, buffer = "0", op = "=";
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, ".", 0]
const operators = ["+", "-", "*", "/", "="]
// round button
function RB(s, color = "yellow") {
const r = 30;
return button(s, "width:" + px(r) + "; height:" + px(r) + "; border-radius: 50%; background-color: " + color + "; margin: 3px;")
}
// yellow button for numbers
function number(s) {
let bt = RB(s, "yellow")
bt.onmouseover = () => bt.style.backgroundColor = "orange"
bt.onmouseout = () => bt.style.backgroundColor = "yellow"
return bt
}
// gray button for operators
function operator(s) {
let bt = RB(s, "silver")
bt.onmouseover = () => bt.style.backgroundColor = "#6060FF "
bt.onmouseout = () => bt.style.backgroundColor = "silver"
br()
return bt
}
function bval() { return Number(buffer) }
function dval() { return Number(display.textContent) }
// Click on number
function numberClick(e) {
if (op == "=") {
display.textContent = ""
op = ""
}
if (op != "")
if (buffer == "0") {
buffer = display.textContent
display.textContent = ""
}
display.textContent += e.srcElement.textContent
}
// evaluate last function and set as display value
function evaluate() {
switch (op) {
case "+": v = bval() + dval(); break;
case "-": v = bval() - dval(); break;
case "*": v = bval() * dval(); break;
case "/": v = bval() / dval(); break;
default: v = Number(display.textContent);
}
return String(v)
}
// evaluate the operator click
function operatorClick(e) {
let flg = (op != "=") && (buffer != 0)
let o = bval() + op + dval() + "="
display.textContent = evaluate() // evaluate the last operator to display
buffer = "0" // clear buffer
o += display.textContent
if (flg) {
history.value += "\n" + o
history.scrollTop = history.scrollHeight;
}
op = e.srcElement.textContent // set new operator
}
/****************************************************************************************
Build the panels
****************************************************************************************/
// build Main box
sidiv("", _bigPadding + _radius + _box)
// left subbox for numbers
sidiv("Calculator", "margin-right: 10px;"); br()
history = textarea("", { readonly: true, style: "resize: none; font-size: 60%; height: 50px;" })
display = div("", _border + _right + "margin-bottom: 15px; height: 22px;") // result display
// build number block
i = 0
for (n of numbers) {
number(String(n)).onclick = numberClick
if (++i % 3 == 0) br()
}
number("C").onclick = () => { op = "="; display.textContent = ""; buffer = "0" }
unselectBase()
// Right box for operators
sidiv()
for (o of operators)
operator(o).onclick = operatorClick;
unselectBase(2)
</script>
</body>
</html>
Reference
この問題について(DML入門−第2部:機能テンプレートの使用), 我々は、より多くの情報をここで見つけました https://dev.to/efpage/introduction-to-dml-part-2-using-functional-templating-1ci0テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol