第二章 openblock-gui实现用户登录1(切换登录与未登录状态)_scratch-gui二次开发 登录-程序员宅基地

技术标签: scratch  react  

切换登录与未登录状态

前言

接下来几章将带大家实现实现用户登录。这里要求大家必须掌握redux与react-redux,否则你将看到云里雾里,考虑到部分人可能没有学习过React、redux与react-redux,这里建议这部分人先别往下,前去bilibili学习下React相关知识:尚硅谷2021版React技术全家桶全套完整版(零基础入门到精通/男神天禹老师亲授),学完再继续。

代码编写

创建一个user-state的reducer,在src->reducers文件夹下新建user-state.js,代码如下:

//初始化字符串的
import keyMirror from 'keymirror'

//定义用户登录状态
const UserState = keyMirror({
    
    //未登录状态
    NOT_LOGINED: null,
    //已登录状态
    LOGINED: null
})

const UserStateOB = Object.keys(UserState)

//初始化用户状态
const initState = {
    
    error: null,
    userData: null,
    loginState: UserState.NOT_LOGINED
}

//获取用户登录状态
const getLoginState = loginState => loginState === UserState.LOGINED

//定义一个reducer
const reducer = function(state=initState, action) {
    
    //暂时未实现任何操作,返回state就行
    return state
}

//将所写的全部暴露出去
export {
    
    reducer as default,
    initState as userStateInitState,
    UserState,
    UserStateOB,
    getLoginState
}

reducers/gui.js作为这个项目所有信息初始化的地方,因此我们定义的user-state也要在此做初始化,这里省略已有的项目代码,用…表示

//引入刚才暴露的reducer与初始化方法
import userStateReducer,{
    userStateInitState} from './user-state'


//将userStateInitState加入到guiInitialState
const guiInitialState = {
    
...
userState: userStateInitState,
...
}


//将userStateReducer加入到guiReducer
const guiReducer = combineReducers({
    
...
userState: userStateReducer,
...
})

接下来container / gui.jsx中为里面定义的GUI添加loginState这个属性,用于标识用户是否登录:

GUI.propTypes = {
    
...
loginState: PropTypes.bool,
...
}

既然定义了loginState这样的一个属性,那么它从哪里获取到的值?是不是来自于user-state.js中getLoginState中检测当前的loginState,因此要在mapStateToProps内加入

import {
    getLoginState} from '../reducers/user-state'


const mapStateToProps = state => {
    
  const loginState = state.scratchGui.userState.loginState;
  return {
    
    ...
	loginState: getLoginState(loginState),
	...
  }
}

根据天禹老师所讲的在容器组件中的state可以通过props传给UI组件,因此接下来我们要去components / gui / gui.jsx新增loginState,并将其传递进menu-bar

//在GUIComponent添加loginState
const GUIComponent = props => {
    
  const {
    
        ...
        loginState,
        ...
        
        ...componentProps
    } = omit(props, 'dispatch');
}

//并且我们也要在用到menu-bar的地方添加 241行左右
<MenuBar
  ...
  loginState={
    loginState}
  ...
/>

然后修改components / menu-bar.jsx中的MenuBar组件的显示,将右上角替加上我们的登录功能:

// 大概在829行加入如下代码
//有个isScratchDesktop() ?之前加就好
<React.Fragment>
     {
    this.props.loginState ? (
         <React.Fragment>
             <MenuBarItemTooltip
                 id="account-nav"
                 place={
    this.props.isRtl ? 'right' : 'left'}
             >
                 <div
                     className={
    classNames(
                         styles.menuBarItem,
                         styles.hoverable,
                         styles.accountNavMenu
                     )}
                 >
                     <img
                         className={
    styles.profileIcon}
                         src={
    profileIcon}
                     />
                     <span>
                         {
    '小白wwj'}
                     </span>
                     <img
                         className={
    styles.dropdownCaretIcon}
                         src={
    dropdownCaret}
                     />
                 </div>
             </MenuBarItemTooltip>
         </React.Fragment>
     ) : <button >登录</button>}
 </React.Fragment>

这时候来看看效果,未登录时
在这里插入图片描述
修改user-state.js的loginState: UserState.LOGINED看看已登录时
在这里插入图片描述
到这就已经能手动切换两种状态了,但是登录按钮有点low,所以让我们改一改吧,就在menu-bar目录下新建login-button.jsx以及login-button.css

// login-button.css
.login-button {
    
    /* 这里颜色查看colors里的$data-primary与主题色保持一致 */
    background: #FF8C1A;
}
// login-button.jsx
import classNames from 'classnames'
import {
    FormattedMessage} from 'react-intl'
import PropTypes from 'prop-types'
import React from 'react'
import Button from '../button/button.jsx'
import style from './login-button.css'

//这里你定义函数组件或者类组件都行
const LoginButton = ({
    
    className,
    onClick
}) => (
    <Button
      className={
    classNames(
          className,
          //这里loginButton不是乱写的css内采用.login-button那么这里必须login小写B大写
          style.loginButton
      )}

      onClick={
    onClick}
    >
        <FormattedMessage
            defaultMessage="LoginButton"
            description="Lable for login"
            id='gui.menuBar.loginButton'
        />

    </Button>
)

//约束参数类型
LoginButton.propTypes = {
    
    className: PropTypes.string,
    onClick: PropTypes.func
}

LoginButton.defaultProps = {
    
    onClick: () => {
    }
}

//把写好的按钮暴露出去
export default LoginButton

在login-button.jsx内我们用到FormattedMessage,设置了id='gui.menuBar.loginButton’对吧,其实这里涉及了一个openblock的国际化的东西,这里由于篇幅关系我在下一章再讲。这里没做处理会报个错说找不到这个id,因为我们没添加这个id,这时候它按钮会显示defaultMessage里的内容影响不大,下一章我们加上就好。
在这里插入图片描述

我们接着往下写,来到menu-bar.jsx在我们刚才添加登录的地方将button换成我们写好的LoginButton

// 替换位置就是刚才我们使用<button></button>的地方
import LoginButton from './login-button.jsx'
<LoginButton className={
    styles.menuBarButton} />

接下来看看效果,效果和我们预测的一样,按钮内容显示了defaultMessage的内容。
在这里插入图片描述
到此这一章节的目标就实现了。下章再见。

上一章
第一章 openblock-gui定制化Logo
下一章
第三章 openblock-gui实现用户登录2(openblock国际化的openblock-l10n)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42644340/article/details/118940384

智能推荐

Android Studio 2.1及其以上版本中的instant run功能 介绍-程序员宅基地

文章浏览阅读83次。Android Studio 2.0及其以后版本中的instant run功能 介绍转 https://blog.csdn.net/zy987654zy/article/details/51496199Studio 2.0 之后就有了instant run 功能说说instant run 功能:字面意思就能明白 即时运行这个功能..._android studio apk最新版instant run在哪

Exp2 后门原理与实践 ——20164316张子遥-程序员宅基地

文章浏览阅读106次。一、实践基本内容1.实践目标(1)使用netcat获取主机操作Shell,cron启动(2)使用socat获取主机操作Shell, 任务计划启动(3)使用MSF meterpreter(或其他软件)生成可执行文件,利用ncat或socat传送到主机并运行获取主机Shell(4)使用MSF meterpreter(或其他软件)生成获取目标主机音频、摄像头、击键记录等内容,并尝..._为什么选择本机作为靶机而不是虚拟机为靶机

在windows和centos系统中搭建PHP7开发环境_php用contos和win-程序员宅基地

文章浏览阅读1.3k次。在win7环境上安装:一:准备软件:1.下载:php-7.1.16-Win32-VC14-x64.zip 地址:http://php.net/downloads.php2.下载:apache2.4:httpd-2.4.33-o102o-x64-vc14-r2.zip 地址:http://httpd.apache.org/download.cgi注意:Apache2.2中是不支持php7的,..._php用contos和win

electron监听系统托盘,electron是否最小化到系统托盘-程序员宅基地

文章浏览阅读940次。在项目中需要判断窗口是否最小化在系统托盘上,任务栏那已经关闭,查了一晚上的api,始终找不到可以调用的方法,最后绞尽脑汁想到了一个办法,那就是在点右上角的关闭按钮时,加个全局变量,用来标识已经最小到系统托盘了,然后在需要判断的地方判断它就行了,打开的时候再设置回来 // 隐藏主窗口但不退出,点击托盘才退出 ipcMain.on('off', (event) => { main..._electron 检测win托盘是否开启

python 建立虚拟环境_建立成功的Python环境的4个基本工具-程序员宅基地

文章浏览阅读240次。python 建立虚拟环境 Python是一种出色的通用编程语言,通常作为第一门编程语言来教授。 二十年来,写了多本书,这仍然是我的选择语言 。 虽然通常说该语言是简单明了的,但尚未描述将Python配置为用于开发的情况(如xkcd所述 )。 复杂的Python环境: xkcd 在日常生活中有许多使用Python的方法。 我将解释如何使用Python生态系统工具,并且我会诚实地说我仍...

大一c语言考试题库 福建省,大一计算机考试题及答案-程序员宅基地

文章浏览阅读154次。马上就要考试了,今天yjbys小编为大家分享的是大一计算机考试试题,计算机不过关的同学们,可以借鉴一下,仅供参考!一、 用适当内容填空1. (机器)语言是计算机唯一能够识别并直接执行的语言。2. 标准ASCⅡ字符集总共有(128)个编码。3. 在计算机内用(2)个字节的二进制数码代表一个汉字。4. 第一台电子计算机ENIAC诞生于(1946)年。5. 对存储器而言有两种基本操作:(读操作)和(写操...

随便推点

delphi中利用Indy的TIdFtp控件实现FTP协议-程序员宅基地

文章浏览阅读361次。现在很多应用都需要上传与下载大型文件,通过HTTP方式上传大文件有一定的局限性。幸好FTP作为一个非常老而且非常成熟的协议可以高效稳定地完成大文件的上传下载,并且可以完美地实现续传。就拿我写的电影服务器管理端程序来说,各种方案比较后,发现使用FTP可以完美地实现要求。但是要通过WinSocket库实现FTP比较麻烦,幸好有Indy--一个包装了大多数网络协议的组件包。通过Indy,程序设计..._delphi idftp changedir

IE代理服务器出错导致浏览器无法上网-程序员宅基地

文章浏览阅读6.8k次。问题描述:突然出现可以ping通外网但浏览器网页打不开,而且不是因为请求超时,而是一点开某网页立即显示代理服务器连不上,所有使用IE浏览器代理设置的浏览器全都上不了网,比如chrome,搜狗浏览器,qq浏览器,IE浏览器等,只有火狐使用的是操作系统的代理服务器设置,可以正常上网解决方法:super+R --》输入“inetcpl.cpl” --》“连接”如果你..._ie代理异常 会影响到谷歌浏览器吗

DataGridView:根据条件改变单元格的颜色-程序员宅基地

文章浏览阅读7.6k次。根据条件改变DataGridView行的颜色可以使用RowPrePaint事件。示例程序界面如下:示例程序代码如下: 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 u..._c# 怎么实现data单元格颜色渐变

跨浏览器复制神器 ZeroClipboard 2.x快速入门详解_zeroclipboard cdn 引入-程序员宅基地

文章浏览阅读483次。有些时候,我们希望让用户在网页上完成某个操作就能自动将指定的内容复制到用户计算机的剪贴板中。但是出于安全原因,大多数现代浏览器都未提供通用的剪贴板复制接口(或即便有,也默认被禁用)。只有IE浏览器可以通过如下方式来进行复制。window.clipboardData.setData("Text", "这里是需要复制的文本内容")想要实现跨浏览器的复制功能,我们就可以使用 ZeroClipboard。Z_zeroclipboard cdn 引入

java -source1.5中不支持lambda表达式-程序员宅基地

文章浏览阅读867次。修改JDK的Language Level即可,参考:https://jingyan.baidu.com/article/fcb5aff762c2f4edaa4a71ee.html_error:(246, 85) java: -source 1.5 中不支持 lambda 表达式 (请使用 -source 8 或更高版本以启用 lambda 表达式)

java教学管理系统设计_JAVA课程设计——多源教学数据管理系统-程序员宅基地

文章浏览阅读118次。团队简介团队名称:419圣斗士团队成员姓名成员介绍任务分配周炳辉(组长)来自网络的一个大佬,穿女装很合适poi与servlet徐宏伟网络中一个具有强大隐藏实力的大哥css,部分jsp与html李金谣旭宝的忠实粉丝,来自格兰迪的挖矿者部分jsp与echarts龚顺德常规划水,一个默默无闻的人团队博客,Student类项目git地址项目git提交记录项目功能架构图与主要功能流程图主要功能图项目运行截图..._java教学管理系统课程设计

推荐文章

热门文章

相关标签