为何=赋值的Markdown字符串与:赋值的对象字段渲染效果不同?
嘿,这个问题其实核心是Markdown对空白缩进的敏感性,结合你用的react-native-markdown-display库的解析逻辑,我来给你拆解清楚:
两种赋值方式的本质差异
看起来两种写法只是变量存储形式不同,但实际上传递给Markdown解析器的字符串内容不一样:
直接用
=赋值的字符串:
如果你写的是无缩进的单行/多行模板字符串,解析器拿到的是完全符合你预期的Markdown内容,没有多余的空格或缩进。比如:const directMd = `# 我的标题 - 列表项A - 列表项B`;这段字符串里的换行和内容都是你想要的,解析器会正常识别标题和列表。
作为对象字段带缩进赋值的字符串:
当你在对象里给字段赋值时,为了代码格式美观加的缩进,会被包含在字符串内容里。比如:const objMd = { content: ` # 我的标题 - 列表项A - 列表项B ` };这里每一行开头的4个空格(或者你用的制表符),是字符串的一部分,会被Markdown解析器当成语法的一部分。
为什么渲染效果不同?
Markdown的核心规范里有一条:以4个连续空格或1个制表符开头的行,会被解析为代码块(或者嵌套元素的标记)。react-native-markdown-display是遵循CommonMark这类标准的,所以它会把你对象字段里带缩进的内容,当成代码块或者嵌套层级的标记来处理,自然就和直接赋值的无缩进内容渲染效果不一样了——比如原本的标题可能变成了代码块里的文本,列表也失去了格式。
怎么解决这个问题?
如果你想保持对象字段的写法,同时让渲染正常,有两个简单方法:
- 去掉字符串内容里的缩进,哪怕对象本身的代码有缩进:
const objMd = { content: `
我的标题
- 列表项A
- 列表项B
`.trim() // 用trim()去掉首尾的空白换行
}; - 用单行字符串拼接换行符,完全避免缩进:
const objMd = { content: "# 我的标题\n- 列表项A\n- 列表项B" };
这样处理后,传递给解析器的字符串内容就和直接赋值的版本一致了,渲染效果也会相同。
内容的提问来源于stack exchange,提问作者Ganda Rain Panjaitan
相关产品推荐
相关产品推荐

