成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

玩轉(zhuǎn)React樣式

scq000 / 943人閱讀

摘要:里面的元素可以分為兩類,一個(gè)是和后面的輸入框,另一類是提交按鈕。就是我們定義的樣式對(duì)象。比如,我現(xiàn)在想要定制不同的用戶名密碼輸入框的邊框顏色。根據(jù)不同的狀態(tài)顯示不同顏色的文本輸入框有兩種狀態(tài),和。方法就會(huì)根據(jù)不同的狀態(tài)返回不同的樣式。

很久很久以前,就有人用CSS來時(shí)給HTML內(nèi)容添加樣式。CSS可以最大限度的分離樣式和內(nèi)容,選擇器也可以很方便的給某些元素添加樣式。你根本找不到任何不用CSS的理由。

但是在React這里就是另外一回事了,雖然React不是不用CSS。但是,它在給元素添加樣式的時(shí)候方式不同。React的核心哲學(xué)之一就是讓可視化的組件自包含,并且可復(fù)用。這就是為什么HTML元素和Javascript放在一起組成了Component(組件)。

React的自包含組件需要在定義的時(shí)候就定義好樣式,這樣才能實(shí)現(xiàn)自包含。本文即將帶你學(xué)習(xí)如何給React的組件添加樣式,當(dāng)然其中包括如何使用CSS。兩個(gè)都會(huì)講到,雖然React不鼓勵(lì)這樣。

準(zhǔn)備工作

要在HTML也中使用React有兩種方法,一個(gè)是使用Webpack編譯打包,另一個(gè)是使用網(wǎng)頁(yè)直接添加React相關(guān)js文件。

用webpack來編譯、打包React組件。并在一個(gè)index.html的頁(yè)面中使用該代碼。具體的準(zhǔn)備步驟可以看這里。最后打包到一個(gè)叫做bundle.js的文件中。HTML頁(yè)面看起來是這樣的:


  
    
    Add style to React
  
  
    
Yo!

也可以在網(wǎng)頁(yè)中直接使用React的js代碼。


  
    
    Add style to React
    
    
    
    
    

  
  
    
Yo!

jquery文件可以不用添加,這里用jquery是用來請(qǐng)求服務(wù)器的,暫時(shí)用不到。

無論使用哪一種方式。最后在頁(yè)面中使用的js都是bundle.js。如果用了webpack的方式,那么bundle.js就是由webpack便已打包生成的。如果用的第二種方法,那么bundle.js就是我們自己手動(dòng)編寫的js代碼。

React生成的HTML元素都會(huì)放在這個(gè)div里面。

項(xiàng)目結(jié)構(gòu)

使用Webpack的話,項(xiàng)目的整體結(jié)果是這樣的:

-webapp
  |--public         // webpack 編譯打包后的js文件所在目錄
       |--css       // css文件所在的目錄
  |--src            // 使用React編寫的代碼所在目錄
  |--index.html     // HTML頁(yè)面

如果你使用網(wǎng)頁(yè)內(nèi)部加載React的話,那么就直接在public目錄下創(chuàng)建一個(gè)bundle.js文件,并在index.html引用即可。

我們就以一個(gè)用戶登錄的界面喂例子。登錄,用戶需呀輸入用戶名、密碼,然后點(diǎn)擊登錄按鈕。

React代碼

我們來看看要實(shí)現(xiàn)這個(gè)功能React代碼應(yīng)該什么樣的。

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類是這個(gè)登錄界面的整體。里面的HTML元素可以分為兩類,一個(gè)是label和label后面的輸入框,另一類是提交按鈕。

LabeledInputText是label和輸入框的組合。SubmitButton是提交按鈕。

生成出來的HTML頁(yè)面是這樣的:


    
    Add style to React
  
  
    

Yo, React

Username :
Password :

在添加樣式之后,效果是這樣的:

使用CSS添加樣式

在React組件上使用CSS樣式比你想的還要簡(jiǎn)單。因?yàn)樽罱KReact還是把組件都轉(zhuǎn)化成了HTML元素,而你會(huì)的各種CSS技巧一樣都可以作用在這些元素上。但是還是有一些小小的地方需要注意:

理解生成的HTML

在使用CSS之前,你需要知道React生成的HTML元素是什么樣子的??雌饋砗苋菀桌斫?,因?yàn)镴SX語法和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組件的結(jié)構(gòu)。所有的東西都在一個(gè)div里面。LabeledInputText就是一個(gè)文字Label和一個(gè)input的文本輸入框的組合。SubmitButton是一個(gè)可以點(diǎn)擊的按鈕,這里其實(shí)是一個(gè)含有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文件包含的全部的樣式。這些樣式主要是給登錄的整個(gè)界面元素的邊框設(shè)置為藍(lán)色,然后在用戶名、密碼和登錄按鈕之間增加間距,最后給按鈕指定背景色為紅色。

接下來需要在React的組件中使用這些樣式。但是直接使用class是不行的。畢竟JSX和HTML元素是有區(qū)別的。就以登錄按鈕為例:

{this.props.title}

在React中指定class名稱使用className。React的className最后就會(huì)轉(zhuǎn)化成HTML的class

這個(gè)登錄按鈕的樣式有一點(diǎn)復(fù)雜:className="form-control form-under form-button"使用了三個(gè)不同的css的selector。這些selector的樣式都會(huì)應(yīng)用到這個(gè)登錄按鈕上。

用React的方式來添加樣式

React推崇的是內(nèi)聯(lián)的方式定義樣式。這樣做的目的就在于讓你的組件更加的容易復(fù)用。和組件相關(guān)的全部?jī)?nèi)容聚合到一起,包括你的組件看起來是什么樣的,是如何工作的。

下面就把之前添加的全部的樣式className都去掉,回到最開始的狀態(tài)。

/* index.js */
{/*

Yo, React

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

登錄使用的三個(gè)組件的render方法返回的內(nèi)容的className已經(jīng)全部都去掉了。

要往React組件內(nèi)添加一個(gè)自定義的樣式對(duì)象,這個(gè)對(duì)象包含的就是css樣式的名稱和樣式的值。只不過樣式的名稱不是css的background-color而是JSX的backgroundColor。例如:

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

return (
    
{/*

Yo, React

*/}
);

小貼士

在React里注釋不能用HTML的方式,那是木有用的。也不能直接用js的
注釋,那也是不行的。而是用大括號(hào)括起來,之后用/**/來注釋。
看起來是這樣的`{/* 這是一個(gè)注釋 */}`。

divStyle就是我們定義的樣式對(duì)象。要使用這個(gè)樣式,只要在React組件中給style賦值。如:style={divStyle}

讓樣式可以自定義

要讓組件的子組件的某些樣式可以自定義很簡(jiǎn)單。只需要使用React組件的props。比如,我現(xiàn)在想要定制不同的用戶名、密碼輸入框的邊框顏色。

    
{/*

Yo, React

*/}

之后在LabeledInputText文件中:

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

每次需要用到邊框值的時(shí)候都從props里面?。?b>this.props.bordercolor。

根據(jù)不同的狀態(tài)顯示不同顏色

HTML的文本輸入框有兩種狀態(tài),focused和blured。用戶要輸入內(nèi)容的時(shí)候,文本框就在focus的狀態(tài)下。用戶的焦點(diǎn)移開,比如開始輸入密碼的時(shí)候,用戶名的文本框就在blur狀態(tài)下了。

在focus的狀態(tài)下的時(shí)候,顯示指定顏色的邊框,否則不顯示邊框。這個(gè)時(shí)候就要用到React的另一個(gè)重要概念:State。

首先,給input注冊(cè)focus和blur的事件處理方法。



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

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

狀態(tài)都存在state里了。然后在input里指定style:style={this.getInputStyles()}getInputStyles方法就會(huì)根據(jù)不同的狀態(tài)返回不同的樣式。

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

這個(gè)方法在focus的時(shí)候去除了input默認(rèn)的效果,blur的時(shí)候保持原樣。

最后

隨著React學(xué)習(xí)的深入,你會(huì)發(fā)現(xiàn)React添加樣式的方式和之前的方式大有不同。如果你透過上面的例子收入思考的話你會(huì)發(fā)現(xiàn),之所以React使用了和以往不同的添加樣式方法是有原因的。HTML、CSS和Javascript這樣的傳統(tǒng)方法在處理網(wǎng)頁(yè)的時(shí)候是非常有用的,但是在處理React組件組成的復(fù)雜的界面的web app的時(shí)候卻顯得力不從心。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/111540.html

相關(guān)文章

  • 用WijmoJS玩轉(zhuǎn)您的Web應(yīng)用 —— React

    摘要:關(guān)于作為一款純前端控件集,秉承快如閃電,觸控優(yōu)先的設(shè)計(jì)理念,在提供優(yōu)質(zhì)服務(wù)和產(chǎn)品的同時(shí),專注于企業(yè)應(yīng)用開發(fā),不斷優(yōu)化產(chǎn)品架構(gòu),與時(shí)俱進(jìn)。靈活的為用戶提供易用輕松的操作體驗(yàn),全面滿足開發(fā)所需,是構(gòu)建企業(yè)應(yīng)用程序最完整的純前端控件集。 前文回顧 在《用 WijmoJS 玩轉(zhuǎn)您的Web應(yīng)用》系列文章中,我們已經(jīng)介紹了Angular和Vue框架下 WijmoJS 的玩法。 而今天,我們將展示如...

    FleyX 評(píng)論0 收藏0
  • 玩轉(zhuǎn) React(二)- 新型前端開發(fā)方式

    摘要:這也就是所謂的單向數(shù)據(jù)流,在這種開發(fā)方式下,會(huì)讓你更新視圖的邏輯非常清晰簡(jiǎn)單,哪怕你的前端交互很復(fù)雜,也不至于讓你的代碼那么容易變成一坨。就是在前端開發(fā)過程中,要善于觀察和抽象。 這是《玩轉(zhuǎn) React》系列的第二篇。在該篇中,我們來了解下,React 的出現(xiàn)到底給我們的開發(fā)方式帶來了什么樣的變化。 我的感觸可以用一個(gè)字來形容,爽!主要爽在以下兩個(gè)方面。 視圖是數(shù)據(jù)的映射(單向數(shù)據(jù)流)...

    RdouTyping 評(píng)論0 收藏0
  • React源碼剖析系列 - 玩轉(zhuǎn) React Transition

    摘要:后面將會(huì)仔細(xì)分析的源碼實(shí)現(xiàn)。更新完成后,對(duì)中的每個(gè)元素執(zhí)行動(dòng)畫的邏輯,對(duì)中的每個(gè)元素執(zhí)行動(dòng)畫的邏輯。事實(shí)上,原因很簡(jiǎn)單,事件在某些情況是不會(huì)被觸發(fā)。總結(jié)動(dòng)畫是組件初次后,才會(huì)被添加到的所有子元素上。參考資料官方文檔事件 過去一年,React 給整個(gè)前端界帶來了一種新的開發(fā)方式,我們拋棄了無所不能的 DOM 操作。對(duì)于 React 實(shí)現(xiàn)動(dòng)畫這個(gè)命題,DOM 操作已經(jīng)是一條死路,而 CSS...

    rottengeek 評(píng)論0 收藏0
  • 用WijmoJS玩轉(zhuǎn)您的Web應(yīng)用 —— Vue.js

    摘要:相反,我們將專注于將添加到用編寫的簡(jiǎn)單應(yīng)用程序中。使用創(chuàng)建應(yīng)用程序。示例應(yīng)用程序有兩個(gè)組件應(yīng)用程序和。除在全球率先支持外,現(xiàn)已全面應(yīng)用于等主流框架中。 showImg(https://segmentfault.com/img/bVbcvaQ?w=500&h=278); 概述 在本文中,我們將展示如何將WijmoJS與NPM和Webpack一起使用來創(chuàng)建最流行的基于JavaScript應(yīng)...

    OnlyMyRailgun 評(píng)論0 收藏0
  • 用WijmoJS玩轉(zhuǎn)您的Web應(yīng)用 —— Ionic

    摘要:在之前的文章中,我們已經(jīng)介紹了使用與三大框架結(jié)合搭建您的應(yīng)用程序。使用創(chuàng)建應(yīng)用程序。擴(kuò)展閱讀用玩轉(zhuǎn)您的應(yīng)用用玩轉(zhuǎn)您的應(yīng)用用玩轉(zhuǎn)您的應(yīng)用近期活動(dòng)問卷調(diào)查揚(yáng)帆萬里,因您前行使用反饋意見征集 前言: 在本文中,我們將著重介紹如何將WijmoJS與Ionic一起使用,來創(chuàng)建一款移動(dòng)端支持優(yōu)先、快捷高效的應(yīng)用程序。在之前的文章中,我們已經(jīng)介紹了使用WijmoJS與Angular、React、Vu...

    fjcgreat 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<