资讯专栏INFORMATION COLUMN

玩转React样式

scq000 / 806人阅读

摘要:里面的元素可以分为两类,一个是和后面的输入框,另一类是提交按钮。就是我们定义的样式对象。比如,我现在想要定制不同的用户名密码输入框的边框颜色。根据不同的状态显示不同颜色的文本输入框有两种状态,和。方法就会根据不同的状态返回不同的样式。

很久很久以前,就有人用CSS来时给HTML内容添加样式。CSS可以最大限度的分离样式和内容,选择器也可以很方便的给某些元素添加样式。你根本找不到任何不用CSS的理由。

但是在React这里就是另外一回事了,虽然React不是不用CSS。但是,它在给元素添加样式的时候方式不同。React的核心哲学之一就是让可视化的组件自包含,并且可复用。这就是为什么HTML元素和Javascript放在一起组成了Component(组件)。

React的自包含组件需要在定义的时候就定义好样式,这样才能实现自包含。本文即将带你学习如何给React的组件添加样式,当然其中包括如何使用CSS。两个都会讲到,虽然React不鼓励这样。

准备工作

要在HTML也中使用React有两种方法,一个是使用Webpack编译打包,另一个是使用网页直接添加React相关js文件。

用webpack来编译、打包React组件。并在一个index.html的页面中使用该代码。具体的准备步骤可以看这里。最后打包到一个叫做bundle.js的文件中。HTML页面看起来是这样的:


  
    
    Add style to React
  
  
    
Yo!

也可以在网页中直接使用React的js代码。


  
    
    Add style to React
    
    
    
    
    

  
  
    
Yo!

jquery文件可以不用添加,这里用jquery是用来请求服务器的,暂时用不到。

无论使用哪一种方式。最后在页面中使用的js都是bundle.js。如果用了webpack的方式,那么bundle.js就是由webpack便已打包生成的。如果用的第二种方法,那么bundle.js就是我们自己手动编写的js代码。

React生成的HTML元素都会放在这个div里面。

项目结构

使用Webpack的话,项目的整体结果是这样的:

-webapp
  |--public         // webpack 编译打包后的js文件所在目录
       |--css       // css文件所在的目录
  |--src            // 使用React编写的代码所在目录
  |--index.html     // HTML页面

如果你使用网页内部加载React的话,那么就直接在public目录下创建一个bundle.js文件,并在index.html引用即可。

我们就以一个用户登录的界面喂例子。登录,用户需呀输入用户名、密码,然后点击登录按钮。

React代码

我们来看看要实现这个功能React代码应该什么样的。

import React from "react";
import {render} from "react-dom";

import LabeledInputText from "./LabeledInputText";
import SubmitButton from "./SubmitButton";

class App extends React.Component {
    constructor(props) {
        super(props);
        this.state = {un: "", pwd: ""};
        this.handleLogin = this.handleLogin.bind(this);
        this.handleUserNameChanged = this.handleUserNameChanged.bind(this);
        this.handlePasswordChanged = this.handlePasswordChanged.bind(this);
    }

    handleUserNameChanged(un) {
        this.setState({un: un});
    }

    handlePasswordChanged(pwd) {
        this.setState({pwd: pwd});
    }

    handleLogin() {
        // $.ajax({
        //     url: this.props.url,
        //     dataType: "json",
        //     method: "POST",
        //     data: this.state,
        //     cache: false,
        //     success: function(data) {
        //         this.setState({data: data});
        //     }.bind(this),
        //     error: function(xhr, status, err) {
        //         console.error(this.props.url, status, err.toString());
        //     }.bind(this)
        // });

        alert(`${this.state.un}, ${this.state.pwd}`);
    }

    render() {
        var divStyle = {
            color: "blue",
            wdith: "150px",
            paddingTop: "10px",
            display: "inline-block"
        };
        return (
            

Yo, React

); } } render(, document.getElementById("content")); // LabeledInputText import React from "react"; export default class LabeledInputText extends React.Component { constructor(props) { super(props); this.handleTextChange = this.handleTextChange.bind(this); } handleTextChange(e) { if (this.props.labelText.toLowerCase() == "username") { this.props.onUserNameChanged(e.target.value); } else { this.props.onPasswordChanged(e.target.value); } } render() { return (
{`${this.props.labelText} :`}
); } } // SubmitButton import React from "react"; export default class SubmitButton extends React.Component { constructor(props) { super(props); // this.state = {value: ""}; // bind event handler this.handleLogin = this.handleLogin.bind(this); } handleLogin(e) { // this.setState({value: e.target.value}); // alert("hello react"); this.props.onLogin() } render() { return ( ); } }

App类是这个登录界面的整体。里面的HTML元素可以分为两类,一个是label和label后面的输入框,另一类是提交按钮。

LabeledInputText是label和输入框的组合。SubmitButton是提交按钮。

生成出来的HTML页面是这样的:


    
    Add style to React
  
  
    

Yo, React

Username :
Password :

在添加样式之后,效果是这样的:

使用CSS添加样式

在React组件上使用CSS样式比你想的还要简单。因为最终React还是把组件都转化成了HTML元素,而你会的各种CSS技巧一样都可以作用在这些元素上。但是还是有一些小小的地方需要注意:

理解生成的HTML

在使用CSS之前,你需要知道React生成的HTML元素是什么样子的。看起来很容易理解,因为JSX语法和HTML元素非常接近。

import React from "react";
import {render} from "react-dom";

import LabeledInputText from "./LabeledInputText";
import SubmitButton from "./SubmitButton";

class App extends React.Component {
    constructor(props) {
        super(props);
        this.state = {un: "", pwd: ""};
    }

    render() {
        var divStyle = {
            color: "blue",
            wdith: "150px",
            paddingTop: "10px",
            display: "inline-block"
        };
        return (
            // 
{/*

Yo, React

*/}
); } } render(, document.getElementById("content"));

render方法里的就是整体的React组件的结构。所有的东西都在一个div里面。LabeledInputText就是一个文字Label和一个input的文本输入框的组合。SubmitButton是一个可以点击的按钮,这里其实是一个含有click事件的div。

全部组件生成HTML之后:

Username :
Password :
Click

里面一些div包含的各种元素,就如前文所说的一样。另外还有的就是很多的css的class。

React中使用CSS

首先添加css样式文件:

input:focus{
    outline: none !important;
    border:1px solid red;
    /*box-shadow: 0 0 10px #719ECE;*/
}
.box-group {
    width:230px;
    border: 1px solid blue;
    padding:5px;
    margin: 10px;
}
.form-control {
    padding:5px;
}

.form-under {
    margin-top:10px;
}
.form-button {
    display:block;
    background-color:red;
    text-align: center;
}

上面就是main.css文件包含的全部的样式。这些样式主要是给登录的整个界面元素的边框设置为蓝色,然后在用户名、密码和登录按钮之间增加间距,最后给按钮指定背景色为红色。

接下来需要在React的组件中使用这些样式。但是直接使用class是不行的。毕竟JSX和HTML元素是有区别的。就以登录按钮为例:

{this.props.title}

在React中指定class名称使用className。React的className最后就会转化成HTML的class

这个登录按钮的样式有一点复杂:className="form-control form-under form-button"使用了三个不同的css的selector。这些selector的样式都会应用到这个登录按钮上。

用React的方式来添加样式

React推崇的是内联的方式定义样式。这样做的目的就在于让你的组件更加的容易复用。和组件相关的全部内容聚合到一起,包括你的组件看起来是什么样的,是如何工作的。

下面就把之前添加的全部的样式className都去掉,回到最开始的状态。

/* index.js */
{/*

Yo, React

*/}
/*LabeledInputText*/
{`${this.props.labelText} :`}
/*SubmitButton*/
{this.props.title}

登录使用的三个组件的render方法返回的内容的className已经全部都去掉了。

要往React组件内添加一个自定义的样式对象,这个对象包含的就是css样式的名称和样式的值。只不过样式的名称不是css的background-color而是JSX的backgroundColor。例如:

let divStyle = {
    width:"230px",
    border: "1px solid blue",
    padding:"5px",
    margin: "10px"
};

return (
    
{/*

Yo, React

*/}
);

小贴士

在React里注释不能用HTML的方式,那是木有用的。也不能直接用js的
注释,那也是不行的。而是用大括号括起来,之后用/**/来注释。
看起来是这样的`{/* 这是一个注释 */}`。

divStyle就是我们定义的样式对象。要使用这个样式,只要在React组件中给style赋值。如:style={divStyle}

让样式可以自定义

要让组件的子组件的某些样式可以自定义很简单。只需要使用React组件的props。比如,我现在想要定制不同的用户名、密码输入框的边框颜色。

    
{/*

Yo, React

*/}

之后在LabeledInputText文件中:

styleObj = Object.assign({}, this.pwdStyle, {border: "1px solid " + this.props.bordercolor});

每次需要用到边框值的时候都从props里面取:this.props.bordercolor

根据不同的状态显示不同颜色

HTML的文本输入框有两种状态,focused和blured。用户要输入内容的时候,文本框就在focus的状态下。用户的焦点移开,比如开始输入密码的时候,用户名的文本框就在blur状态下了。

在focus的状态下的时候,显示指定颜色的边框,否则不显示边框。这个时候就要用到React的另一个重要概念:State

首先,给input注册focus和blur的事件处理方法。



// hanleFocus & handleBlur
handleFocus() {
    this.setState({focused: true});
}

handleBlur() {
    this.setState({focused: false});
}

状态都存在state里了。然后在input里指定style:style={this.getInputStyles()}getInputStyles方法就会根据不同的状态返回不同的样式。

    getInputStyles() {
        let styleObj;
        if (this.state.focused == true) {
            styleObj = {outlineStyle: "none"};
        }
        return styleObj;
    }

这个方法在focus的时候去除了input默认的效果,blur的时候保持原样。

最后

随着React学习的深入,你会发现React添加样式的方式和之前的方式大有不同。如果你透过上面的例子收入思考的话你会发现,之所以React使用了和以往不同的添加样式方法是有原因的。HTML、CSS和Javascript这样的传统方法在处理网页的时候是非常有用的,但是在处理React组件组成的复杂的界面的web app的时候却显得力不从心。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/111540.html

相关文章

  • 用WijmoJS玩转您的Web应用 —— React

    摘要:关于作为一款纯前端控件集,秉承快如闪电,触控优先的设计理念,在提供优质服务和产品的同时,专注于企业应用开发,不断优化产品架构,与时俱进。灵活的为用户提供易用轻松的操作体验,全面满足开发所需,是构建企业应用程序最完整的纯前端控件集。 前文回顾 在《用 WijmoJS 玩转您的Web应用》系列文章中,我们已经介绍了Angular和Vue框架下 WijmoJS 的玩法。 而今天,我们将展示如...

    FleyX 评论0 收藏0
  • 玩转 React(二)- 新型前端开发方式

    摘要:这也就是所谓的单向数据流,在这种开发方式下,会让你更新视图的逻辑非常清晰简单,哪怕你的前端交互很复杂,也不至于让你的代码那么容易变成一坨。就是在前端开发过程中,要善于观察和抽象。 这是《玩转 React》系列的第二篇。在该篇中,我们来了解下,React 的出现到底给我们的开发方式带来了什么样的变化。 我的感触可以用一个字来形容,爽!主要爽在以下两个方面。 视图是数据的映射(单向数据流)...

    RdouTyping 评论0 收藏0
  • React源码剖析系列 - 玩转 React Transition

    摘要:后面将会仔细分析的源码实现。更新完成后,对中的每个元素执行动画的逻辑,对中的每个元素执行动画的逻辑。事实上,原因很简单,事件在某些情况是不会被触发。总结动画是组件初次后,才会被添加到的所有子元素上。参考资料官方文档事件 过去一年,React 给整个前端界带来了一种新的开发方式,我们抛弃了无所不能的 DOM 操作。对于 React 实现动画这个命题,DOM 操作已经是一条死路,而 CSS...

    rottengeek 评论0 收藏0
  • 用WijmoJS玩转您的Web应用 —— Vue.js

    摘要:相反,我们将专注于将添加到用编写的简单应用程序中。使用创建应用程序。示例应用程序有两个组件应用程序和。除在全球率先支持外,现已全面应用于等主流框架中。 showImg(https://segmentfault.com/img/bVbcvaQ?w=500&h=278); 概述 在本文中,我们将展示如何将WijmoJS与NPM和Webpack一起使用来创建最流行的基于JavaScript应...

    OnlyMyRailgun 评论0 收藏0
  • 用WijmoJS玩转您的Web应用 —— Ionic

    摘要:在之前的文章中,我们已经介绍了使用与三大框架结合搭建您的应用程序。使用创建应用程序。扩展阅读用玩转您的应用用玩转您的应用用玩转您的应用近期活动问卷调查扬帆万里,因您前行使用反馈意见征集 前言: 在本文中,我们将着重介绍如何将WijmoJS与Ionic一起使用,来创建一款移动端支持优先、快捷高效的应用程序。在之前的文章中,我们已经介绍了使用WijmoJS与Angular、React、Vu...

    fjcgreat 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<