Javascript Fetch API 如何在点击用户时获取用户的 post 详细信息?

Javascript Fetch API How to get user's post details when you click on the user?

我正在努力学习 Javascript 并且我正在做一个练习来获取两个不同的 API,一个用于用户,另一个用于帖子。练习有两个问题;第一个问题是关于获取用户并将其显示在网站上。用户是从这个网站获取的 https://jsonplaceholder.typicode.com/users.

第二个问题是关于获取帖子的。当用户在网站上显示时,您可以 select 一个用户并获取他的帖子。用户的帖子将显示在列表中。要获取 post/posts,我需要使用此 url:/posts?userId={userId}。例如,如果您单击具有 userId 5 的用户,您将从以下 url 中获取他的帖子:https://jsonplaceholder.typicode.com/posts?userId=5 我已经完成了第一个问题,但需要帮助才能完成第二个问题。谁能帮帮我?

How to place posts under the username?

fetch('https://jsonplaceholder.typicode.com/users')
.then(function (response) {
    return response.json();
})
.then(function (data) {
    appendData(data);
})
.catch(function (err) {
    console.log('error: ' + err);
});

function appendData(data) {
var mainContainer = document.getElementById("users");
for (var i = 0; i < data.length; i++) {
    var li = document.createElement("li");
    li.innerHTML =  data[i].username;

    li.dataset.userId = data[i].id;
    
    li.addEventListener('click', (event) => getPosts(event))
    mainContainer.appendChild(li);
}

}

function getPosts(event) {

var userId = event.target.dataset.userId;

fetch(`https://jsonplaceholder.typicode.com/posts?userId=${userId}`)
    .then(response => response.json())
    .then(json => renderPosts(json))
}

function renderPosts(posts) {
var titleContainer = document.getElementById("postTitle");
var bodyContainer = document.getElementById("postBody");
for (var i = 0; i < posts.length; i++) {
    var liTitle = document.createElement("li");
    var liBody = document.createElement("li");

    liTitle.innerHTML =  posts[i].title;
    liBody.innerHTML = posts[i].body;

    titleContainer.appendChild(liTitle);
    bodyContainer.appendChild(liBody);

//var title = posts.data.title;
//var body = posts.data.body;
//document.getElementById("postTitle").innerHTML = titleContainer;
//document.getElementById("postBody").innerHTML = bodyContainer;
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Javascript API Fetch Users and Posts</title>
</head>
<body>
    <h1>Users</h1>
    
    <div id="users"></div>
    <div id="postBody"></div>
    <div id="postTitle"></div>



    <script src="script.js"></script>
</body>
</html>

    
    <div id="users"></div>
    <div id="postBody"></div>
    <div id="postTitle"></div>

fetch('https://jsonplaceholder.typicode.com/users')
.then(function (response) {
    return response.json();
})
.then(function (data) {
    appendData(data);
})
.catch(function (err) {
    console.log('error: ' + err);
});


function appendData(data) {
var mainContainer = document.getElementById("users");
for (var i = 0; i < data.length; i++) {
    var li = document.createElement("li");
    li.innerHTML =  data[i].username;

  li.setAttribute('id',data[i].id);
  li.addEventListener('click' ,getPosts,false);


    mainContainer.appendChild(li);
}
}


function getPosts(event) {
    fetch(`https://jsonplaceholder.typicode.com/posts?userId${event.target.id}`)
        .then(response => response.json())
        .then(response => {
         console.log(response)
      //loop through response and  render  data 
    })
        
}

为了让您的代码正常工作,这里有一些注释更正。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Javascript API Fetch Users and Posts</title>
</head>
<body>
    <h1>Users</h1>

    <div id="users"></div>

    <script src="script.js"></script>
</body>
</html>
            fetch('https://jsonplaceholder.typicode.com/users')
        .then(function (response) {
            return response.json();
        })
        .then(function (data) {
            appendData(data);
        })
        .catch(function (err) {
            console.log('error: ' + err);
        });

    function appendData(data) {
        var mainContainer = document.getElementById("users");
        for (var i = 0; i < data.length; i++) {
            var li = document.createElement("li");
            li.innerHTML =  data[i].username;
            li.classList.add('item');
            li.dataset.userId = data[i].id;
            li.addEventListener('click', (event) => getPosts(event))
            mainContainer.appendChild(li);
        }

    }

    function cleanPosts() {
        var users = document.querySelectorAll('.item ul');
        for(var i = 0; i < users.length; i++) {
            if(users[i]) {
                users[i].style.display = 'none';
            }
        }
    }

    function getPosts(event) {

        var userId = event.target.dataset.userId;

        fetch(`https://jsonplaceholder.typicode.com/posts?userId=${userId}`)
            .then(response => response.json())
            .then(json => renderPosts(json, event.target))
    }

    function renderPosts(posts, target) {
        var postsList = target.childNodes[1];

        cleanPosts();

        if(postsList){
            postsList.style.display = 'block';
        } else {
            var list = document.createElement("ul");

            for (var i = 0; i < posts.length; i++) {

                var item = document.createElement("li");
                var liTitle = document.createElement("strong");
                var liBody = document.createElement("p");

                liTitle.innerHTML = posts[i].title;
                liBody.innerHTML = posts[i].body;

                item.appendChild(liTitle);
                item.appendChild(liBody);
                list.appendChild(item);
            }

            target.appendChild(list);
        }

    }

我添加的一些您可能想要查看的内容是 addEventListener() and the use of data attributes