使用 ale.js 制作一個(gè)小而美的表格編輯器(2)

今天來(lái)教大家如何使用 ale.js 制作一個(gè)小而美的表格編輯器,首先先上 gif:

image

是不是還是有一點(diǎn)非常 cool 的感覺(jué)的策吠?那么我們現(xiàn)在開(kāi)始吧层皱!

這是我們這篇文章結(jié)束后完成的效果(如果想繼續(xù)完成請(qǐng)?jiān)L問(wèn)第三篇文章):

image

ok,那繼續(xù)開(kāi)始吧(本篇文章是表格編輯器系列的第二篇文章识椰,如果您還沒(méi)有看過(guò)第一篇,請(qǐng)?jiān)L問(wèn) 第一篇文章(開(kāi)源中國(guó))):

首先我們寫一個(gè)名叫 staticData 的 object深碱,里面添加2個(gè)屬性腹鹉,分別是 sortBy 和 sortType:(關(guān)于 staticData 這里不做闡述,如果有需要請(qǐng)?jiān)L問(wèn) cn.alejs.org

staticData: {
    sortBy: -1, //排序列索引敷硅,默認(rèn)沒(méi)有功咒,所以為-1
    sortType: 'down' //排序類型愉阎,默認(rèn)為降序
}

之后我們?cè)?th 標(biāo)簽里面增加一個(gè) onclick 屬性,指向 methods 里面的 handleTheadOnclick 函數(shù)力奋,并傳遞一個(gè) event 作為參數(shù):

(之前的代碼)

this.data.bookHeader.forEach(function(val, i, arr) {
    returnVal += "<th>" + val + "</th>";
})

(改進(jìn)后的代碼)

this.data.bookHeader.forEach(function(val, i, arr) {
    returnVal += "<th onclick='this.methods.handleTheadOnclick(event)'>" + val + "</th>";
})

為了讓他顯示排序時(shí)的小箭頭榜旦,我們需要再改進(jìn)這行代碼為這樣:

this.data.bookHeader.forEach(function(val, i, arr) {
    returnVal += "<th onclick='this.methods.handleTheadOnclick(event)'>" + val + (sortBy === i ? getSortSign() : '') + "</th>";
})

由于 sortBy 變量和 getSortSign 函數(shù)變量還未定義,所以我們要在之前的代碼里引用一下:

(原來(lái)的代碼)

var returnVal = "<table><thead><tr>";

(改進(jìn)后的代碼)

var returnVal = "<table><thead><tr>",
    getSortSign = this.methods.getSortSign,
    sortBy = this.staticData.sortBy;

其中景殷,sortBy 變量指向的是靜態(tài) data 里的 sortBy 變量溅呢,這個(gè)我們已經(jīng)定義了,所以先不管他猿挚。而另一個(gè) getSortSign 函數(shù)還沒(méi)有定義咐旧,所以我們?cè)?methods 里面定義一下他:

getSortSign() {
    if (this.staticData.sortType === "up") {
        return '\u2191';
    } else {
        return '\u2193';
    }
}

其功能主要就是判斷是正序還是倒敘,并分別輸出正反小箭頭绩蜻。

之后我們就需要完成 handleTheadOnclick 函數(shù)了铣墨。它分別引用了 changeSortType 和 sortList 函數(shù):

handleTheadOnclick(e) {
    this.methods.changeSortType(e);
    this.methods.sortList(e);
}

其中 changeSortType 函數(shù)是用來(lái)改變排序類型的,而 sortList 函數(shù)使用來(lái)排序的办绝。

那么我們先完成 changeSortType 函數(shù)吧:

changeSortType(e) {
    this.staticData.sortBy = e.target.cellIndex;
    if (this.staticData.sortType === "up") {
        this.staticData.sortType = "down";
    } else {
        this.staticData.sortType = "up";
    }
}

ok伊约,這個(gè)函數(shù)的功能和實(shí)現(xiàn)都非常簡(jiǎn)單,其中 cellIndex 是用來(lái)獲取這是屬于表格中那一列的孕蝉。

那么 sortList 函數(shù)的實(shí)現(xiàn)則稍微有些復(fù)雜:

sortList(e) {
    //獲取列索引值
    var index = e.target.cellIndex;
    //判斷排序類型
    if (this.staticData.sortType === "up") {
        //使用數(shù)組的 sort 函數(shù)進(jìn)行排序碱妆,分別按 charCode 進(jìn)行排序
        this.data.bookData.sort(function(a, b) {
            return a[index].charCodeAt(0) > b[index].charCodeAt(0) ? 1 : -1;
        })
    } else {
        this.data.bookData.sort(function(a, b) {
            return a[index].charCodeAt(0) < b[index].charCodeAt(0) ? 1 : -1;
        })
    }

    this.data.bookData = this.data.bookData;
}

這是我們目前的全部 js 代碼:

Ale("excel", {
    template() {
        return this.methods.handleTemplateRender();
    },
    methods: {
        handleTemplateRender() {
            //定義DOM基本結(jié)構(gòu)
            var returnVal = "<table><thead><tr>",
                getSortSign = this.methods.getSortSign,
                sortBy = this.staticData.sortBy;

            //循環(huán)遍歷bookHeader數(shù)據(jù)并輸出
            this.data.bookHeader.forEach(function(val, i, arr) {
                returnVal += "<th onclick='this.methods.handleTheadOnclick(event)'>" + val + (sortBy === i ? getSortSign() : '') + "</th>";
            })
            returnVal += "</thead></tr><tbody>";

            //循環(huán)遍歷bookData數(shù)據(jù)并輸出
            this.data.bookData.forEach(function(thisBook, i, arr) {
                //輸出一行
                returnVal += "<tr>";
                thisBook.forEach(function(val, i, arr) {
                    //輸出一列
                    returnVal += "<td>" + val + "</td>";
                })
                returnVal += "</tr>";
            })
            returnVal += "</tbody></table>";

            //返回DOM結(jié)構(gòu)
            return returnVal;
        },
        handleTheadOnclick(e) {
            this.methods.changeSortType(e);
            this.methods.sortList(e);
        },
        changeSortType(e) {
            this.staticData.sortBy = e.target.cellIndex;
            if (this.staticData.sortType === "up") {
                this.staticData.sortType = "down";
            } else {
                this.staticData.sortType = "up";
            }
        },
        sortList(e) {
            var index = e.target.cellIndex;
            if (this.staticData.sortType === "up") {
                this.data.bookData.sort(function(a, b) {
                    return a[index].charCodeAt(0) > b[index].charCodeAt(0) ? 1 : -1;
                })
            } else {
                this.data.bookData.sort(function(a, b) {
                    return a[index].charCodeAt(0) < b[index].charCodeAt(0) ? 1 : -1;
                })
            }

            this.data.bookData = this.data.bookData;
        },
        getSortSign() {
            if (this.staticData.sortType === "up") {
                return '\u2191';
            } else {
                return '\u2193';
            }
        }
    },
    data: {
        bookHeader: [
            "Book", "Author", "Language", "Published", "Sales"
        ],
        bookData: [
            ["The Lord of the Rings", " J. R. R. Tolkien", "English", "1954-1955", "150 million"],
            ["The Little Prince", "Antoine de Saint-Exupéry", "French", "1943", "140 million"],
            ["Dream of the Red Chamber", "Cao Xueqin", "Chinese", "1791", "100 million"]
        ]
    },
    staticData: {
        sortBy: -1,
        sortType: 'down'
    }
})
Ale.render("excel", {
    el: "#app"
})

然后效果就如下圖所示啦:

image

如果想了解更多,歡迎關(guān)注我在明天推出的第三篇教程昔驱,同時(shí)也關(guān)注一下 alejs 哦疹尾,感謝各位!

(非常重要:如果有能力的話不妨去 Github碼云 上 star 一下我們吧骤肛!不過(guò)如果您特別喜歡 alejs 的話也可以 watch 或 fork 一下哦纳本!十分感謝!)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末腋颠,一起剝皮案震驚了整個(gè)濱河市繁成,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌淑玫,老刑警劉巖巾腕,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異絮蒿,居然都是意外死亡尊搬,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門土涝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)佛寿,“玉大人,你說(shuō)我怎么就攤上這事但壮〖叫海” “怎么了常侣?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)弹渔。 經(jīng)常有香客問(wèn)我胳施,道長(zhǎng),這世上最難降的妖魔是什么肢专? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任巾乳,我火速辦了婚禮,結(jié)果婚禮上鸟召,老公的妹妹穿的比我還像新娘胆绊。我一直安慰自己,他們只是感情好欧募,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布压状。 她就那樣靜靜地躺著,像睡著了一般跟继。 火紅的嫁衣襯著肌膚如雪种冬。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天舔糖,我揣著相機(jī)與錄音娱两,去河邊找鬼。 笑死金吗,一個(gè)胖子當(dāng)著我的面吹牛十兢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播摇庙,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼旱物,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了卫袒?” 一聲冷哼從身側(cè)響起宵呛,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎夕凝,沒(méi)想到半個(gè)月后宝穗,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡码秉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年逮矛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泡徙。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡橱鹏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出堪藐,到底是詐尸還是另有隱情莉兰,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布礁竞,位于F島的核電站糖荒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏模捂。R本人自食惡果不足惜捶朵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望狂男。 院中可真熱鬧综看,春花似錦、人聲如沸岖食。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)泡垃。三九已至析珊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蔑穴,已是汗流浹背忠寻。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留存和,地道東北人奕剃。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像捐腿,于是被迫代替她去往敵國(guó)和親祭饭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容