Warm tip: This article is reproduced from serverfault.com, please click

其他-Hugo动态导航栏菜单项,用于登录,注销

(其他 - Hugo dynamic navbar menu item for sign in, sign out)

发布于 2020-12-01 02:05:08

我想将一个项添加到我的导航栏中,该项会根据用户是登录还是注销而改变。这是一个非常常见的功能-该网站在右上方。目前,我能做的最好的就是将静态“登录”和“退出”项添加到导航栏中。

例如,我可能提供一个JavaScript函数,其返回值确定菜单项。

请注意,我已经可以进行身份​​验证了。在这里,我只是在问如何改善对Hugo导航栏的静态“登录注销”项目。

Questioner
John McGehee
Viewed
0
CodeMonkey 2020-12-04 22:56:06

一种方法是使用隐藏它们的css类在导航栏上登录并注销项目:

.hidden{
   display: none;
   visibility: hidden;
}

然后在你的JS身份验证代码中显示相关代码

const signInButton = document.getGelementById('sign-in-button');
const signOutButton = document.getGelementById('sign-out-button');

if(userIsSignedIn()){
    signInButton.classList.add('hidden');
    signOutButton.classList.remove('hidden');
}else{
    signInButton.classList.remove('hidden');
    signOutButton.classList.add('hidden');
}

另一种方法是在导航栏中没有用于登录/注销的项目,然后使用JS添加它们

const navBar = document.getGelementById('nav-bar');

if(userIsSignedIn()){
    addButton('sign-in', 'Sign Out');
    removeButton('sign-out');
}else{
    addButton('sign-out', 'Sign Out');
    removeButton('sign-in');
}
    
function addButton(id, value) {
    var btn = document.createElement('button');
    btn.id = id;
    btn.innerText = value;
    
    if(event.target.id == 'sign-in'){
        btn.addEventListener('click', (event)=>{            
                signIn();
        });
    }else if(event.target.id == 'sign-out'){
        btn.addEventListener('click', (event)=>{            
                signOut();
        });
    }

    navBar.append(btn);
}   


function removeButton(id) {
    var elem = document.getElementById(id);
    if(elem){
        elem.parentNode.removeChild(elem);
    }
}

虽然这可能有点复杂,但没有真正的额外好处。