如何從含有佔位符的字符串生成一個ReactNode數組

最近項目中有這樣的需求,就是將含有佔位符的字符串轉成下面的樣子,假設要渲染的字符串是${}沒搶到,表示很失望,最終要渲染成下面的樣子:
uploading-image-468100.png

假設${}要被替換成<Tag />元素,那麼最終應該返回的是:

[<Tag />, '沒搶到,表示很失望']

分析

這裏再使用string.prototype.replace就行不通了,因爲這個方法返回的是一個字符串,我們需要的是一個ReactNode數組。那麼我們很容易想到,先把字符串split,然後再把插進去:

const strArr = '${}沒搶到,表示很失望'.split('${}');
const result = [];
for (let i = 0; i < strArr.length; i++) {
	result.push(strArr[i], <Tag/>)
}
result.pop();
console.log(result);

不使用for循環

前面的方法,我們替換掉了思路是在佔位符前後切開字符串之後,從而保留了佔位符,然後再使用map進行替換:

'${}123${}456xxx${}999'.
replace(/\$\{\}/g, '#@${}#@') // #@代表佔位符的邊界
.split('#@') // 以邊界進行分割
.map(str => {
    if (str === '${}') {
        return <Tag />
    }
    return str
})

reduce 法

上面的方法中,進行了全局的replace和split,最後再map,導致複雜度大大提升,下面的reduce方法就更好一點

'${}123${}456xxx${}999'.split('${}').reduce((prev, curr, idx, arr) => {
    if (idx !== arr.length - 1) {
        prev.push(curr, '<div />');
    } else {
        prev.push(curr);
    }
    return prev;
}, []);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章