Vue ソース コードを探索する: 口ひげテンプレート エンジン (10) 連続した点シンボルを持つマルチレイヤー オブジェクトが見つからない問題を解決し、ループ構造のコンパイルへの道を開く

上記は、Vue のソース コードを調べています: 口ひげテンプレート エンジン (9) 単一レイヤーの no-like 結果トークンを DOM 文字列に変換します。トークンを文字列に変換するビジネス ロジックを単純に処理しましたが、最も安価
な中括弧
のみを処理しました。プロジェクトを
開いて、www のindex.html コードを以前のものに戻しましょう。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script src = "/xuni/bundle.js"></script>
    <script>
        let templateStr = `
            <div>
                {
       
       {#students}}
                    <ul>
                        <li>{
       
       { item.name }}</li>
                        {
       
       {#item.list}}
                            <li>{
       
       { . }}</li>
                        {
       
       {/item.list}}
                    </ul>
                {
       
       {/students}}
            </div>
        `;
        let data = {
      
      
            name: "小猫猫",
            age: 2,
            students: [
                {
      
      
                    id: 0,
                    name: "小明",
                    list: [
                        "篮球",
                        "唱",
                        "跳"
                    ]
                },
                {
      
      
                    id: 1,
                    name: "小红",
                    list: [
                        "电子游戏",
                        "计算机编程"
                    ]
                }
            ]
        }
        GrManagData.render(templateStr,data);
    </script>
</body>
</html>

このループの入れ子構造を扱ってみましょう

そしてプロジェクトを実行してみると、# 記号に問題があることがわかり、これは処理できません。
ここに画像の説明を挿入
ここでは明らかに並列構造では処理できず、再帰が必要です。
まず、次のことが考えられます。非常に単純なアイデアです。番号記号を付けずに
renderTemplate を呼び出します。この renderTemplate を再帰的に呼び出すことはできないでしょうか?
アイデアはとてもシンプルですか?

しかし、再帰を書く前に、まず問題を解決する必要があります

たとえば、www の下のindex.html を
次のように変更しました。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script src = "/xuni/bundle.js"></script>
    <script>
        let templateStr = `
            <div>
                我超喜欢我家的{
       
       {name}},我家{
       
       {name}}也超喜欢我,它今年{
       
       {a.b.c}}岁啦
            </div>
        `;
        let data = {
      
      
            name: "小猫猫",
            a: {
      
      
                b: {
      
      
                    c: 2
                }
            }
        }
        GrManagData.render(templateStr,data);
    </script>
</body>
</html>

このように、データ内のaオブジェクト配下のbオブジェクト配下のcオブジェクトを使用して
プロジェクトを実行したところ、
ここに画像の説明を挿入
点を認識できずに直接未定義になってしまいました
ここに画像の説明を挿入

実際、abc によって生成された名前を確認するには、このファイルを印刷することができます。
ここに画像の説明を挿入
ここでは、console.log を使用して、その内容を確認します。
ここに画像の説明を挿入

そうです、ここで得られたものは確かに abc です
が、現在の文法は次と同等です。

data["a.b.c"]

ここで、js の括弧は直接添字のみをサポートしています。彼は私たちの要点の文法を知らないので、それを見つけるのを手伝ってくれません。したがって、ここに問題があります。実際に、最初に src の下に lookup.js を作成

ましょ

このようなコード

/*
    可以在data中,用连续点符号的形式找到对应键值
*/
export default function lookup(data,keyName) {
    
    

}

まず関数を公開します。
この関数には 2 つのパラメータが必要です。1 つ目は合計データです。それを探している場合は、合計データを指定する必要があります。
次に、2 番目のパラメータはフィールド名で、たとえば、
この関数を作成すると、abc はオブジェクトのオブジェクトのオブジェクトを取得できます。

ルックアップの内容をこれに変更します

/*
    可以在data中,用连续点符号的形式找到对应键值
*/
export default function lookup(data,keyName) {
    
    
    
    //判断keyName字符串中是否有  .  符号
    if(keyName.indexOf(".") > 0) {
    
    
        //将keyName按点拆分成数组
        var names = keyName.split('.');
        //存一个 指向 data 的临时变量
        let temp = data;

        //循环遍历 用点拆分开的数组names
        for(let i = 0;i < names.length;i++) {
    
    
            //  一层一层寻找对应字段
            temp = temp[names[i]];
        }
        //将得到的结果返回
        return temp;
    }
    //没有  点符号 就直接将data中的keyName字段返回就ok了
    return data[keyName]
}

入ってくると、まず keyName にドット記号があるかどうかを判断し、
入ってきた場合は、文字列分割の分割を使用して配列に分割し、次に
ゼロ時間変数を使用してデータを格納します。
ドット記号で分割した配列をループします。すると、内容は当然 ["a", "b", "c"] となり、ループが行われると内容は abc になり、最初の temp の

はデータを指します。最初の添字は a で、 2 回目はデータの下で a を検索します。Temp は現在、データの下で a で、2 番目の添字は b です。これは、3 回目
の a の下で b を検索することです。
b で確立されます。c を見つけるのは
非常に簡単で、最終的に処理されて temp に返されます。

ドット記号がなく、if が入力されない場合は、data の下の keyName 値を直接見つける方が簡単です。

次に、
src の下の renderTemplate.js コードを変更します。


ここに画像の説明を挿入
ここではプロジェクトを実行するためにルックアップを導入し、使用します。
ここに画像の説明を挿入
データを表示して読み取ることができます。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_45966674/article/details/132104132