You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中通过DOM操作添加<li>元素为何无列表样式?

问题原因及解决方法

问题根源

你代码里的核心错误是对appendChild方法的返回值理解有误:Element.appendChild()返回的是被插入的子节点,而非调用该方法的父元素。

你写的let name2use = nameElm.appendChild(nameText),这里name2use拿到的是文本节点nameText,不是你创建的<li>元素。之后你把这个文本节点直接追加到<ol>里,最终DOM结构变成了<ol>文本1文本2文本3...</ol>——没有<li>标签包裹内容,浏览器自然不会识别为列表项,也就不会显示编号、换行等列表样式。

快速修复(直接操作DOM方式)

修改stepTwo里的循环逻辑,直接把完整的<li>元素追加到<ol>中:

function stepTwo(){
axiosTest()
        .then(data =>{
           for (let i = 0; i < data.length; i++) {
 console.log(data[i].name);
 let nameElm = document.createElement("li");
 let nameText = document.createTextNode(data[i].name);
 nameElm.appendChild(nameText); // 直接把文本放入li,不需要接收返回值
 document.getElementById("list4names").appendChild(nameElm); // 把整个li加到ol里
}
        })
    }

更符合React规范的写法(推荐)

直接操作DOM不是React的最佳实践,应该用状态管理数据,通过JSX渲染列表:

import React, { useState, useEffect } from "react";
import { createRoot } from 'react-dom/client';
import axios from "axios";

const BASEURL = "https://jsonplaceholder.typicode.com/users";

function Component1(){
    const [names, setNames] = useState([]);

    // 组件挂载时发起请求
    useEffect(() => {
        axios.get(BASEURL)
            .then(res => setNames(res.data.map(item => item.name)))
            .catch(err => console.error(err));
    }, []);

    return(
        <div>
            <ol>
                {/* 通过map渲染列表项,自动生成li标签 */}
                {names.map((name, idx) => (
                    <li key={idx}>{name}</li>
                ))}
            </ol>
        </div>
    )
}

const root = createRoot(document.getElementById('root'));
root.render(<Component1 />);

内容的提问来源于stack exchange,提问作者DennisM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:16:06