Skip to content

5.5 - コンポーネントの継承

コンポーネントの継承

時には、ビューに注入できるコンポーネントを作りたいと思うことがあります。そのためには、CSSとHTMLの両方を読み込んで、HTMLの正しい部分に挿入する必要があります。

そのためには、コンポーネント名を受け取り、コンポーネント名からタグを作成し、コンポーネント名に基づいてHTMLとCSSをロードするadd_component関数を作成します。この関数は、views/app/content_loader.rs ファイルに定義することにします。

pub fn add_component(component_tag: String, 
    html_data: String) -> String {
    let css_tag: String = component_tag.to_uppercase() + "_CSS";
    let html_tag: String = component_tag.to_uppercase() + "_HTML";
    let css_path = String::from("./templates/components/") + &component_tag.to_lowercase() + ".css";
    let css_loaded = read_file(&css_path);
    let html_path = String::from("./templates/components/") + &component_tag.to_lowercase() + ".html";
    let html_loaded = read_file(&html_path);
    let html_data = html_data.replace(html_tag.as_str(), &html_loaded);
    let html_data = html_data.replace(css_tag.as_str(), &css_loaded);
    return html_data
} 

ここでは、同ファイルで定義されているread_file関数を使用します。そして、コンポーネントのHTMLとCSSをビューデータにインジェクションします。templates/components/ディレクトリにコンポーネントを入れ子にしていることに注意してください。今回は、ヘッダーコンポーネントを挿入するので、add_component関数にヘッダーを渡すと、header.htmlとheader.cssファイルを読み込もうとします。templates/components/header.html ファイルでは、以下の HTML を定義する必要があります。

<div class="header">
    <p>complete tasks: </p><p id="completeNum"></p>
    <p>pending tasks: </p><p id="pendingNum"></p>
</div>

ここでは、完了したToDoと保留中のToDoの件数を表示するだけです。templates/components/header.css ファイルで、次の CSS を定義する必要があります。

.header {
    background: #034f84;
    margin-bottom: 0.3rem;
}
.header p {
    color: white;
    display: inline-block;
    margin: 0.5rem;
    margin-right: 0.4rem;
    margin-left: 0.4rem;
}

add_component関数がCSSとHTMLを正しい位置に挿入するためには、templates/main.htmlファイルの