后端程序員入門react筆記(四)-綜合運用,寫一個小demo

樣式模塊化

有時候我們會遇到這樣的問題,有兩個css對一個class聲明了樣式,這樣的話后引入的css會覆蓋前面的css樣式,導致樣式沖突,那么我們怎么解決這種問題呢,我們可以使用樣式的模塊化,我們起名一個index.module.css和一個content.module.css
在這里插入圖片描述

  • 我們在代碼中這樣使用
import React from "react";
import index from "./css/index.module.css";
import content from "./css/content.module.css";class Hello extends React.Component {render() {console.log("i am render")return (<ul><h1 className={index.title}>i am index.css</h1><h1 className={content.title}>i am content.css</h1></ul>)}
}
//導出組件
export default Hello;

Webstorm中的快捷鍵

  • rcc+tab鍵:用ES6模塊系統創建一個React組件類
import React, {Component} from 'react';class Hello extends Component {render() {return (<div></div>);}
}export default Hello;
  • rccp+tab鍵:創建一個帶有PropTypes和ES6模塊系統的React組件類
import React, {Component} from 'react';
import PropTypes from 'prop-types';class Hello extends Component {render() {return (<div></div>);}
}Hello.propTypes = {};export default Hello;
  • rcfc+tab鍵:創建一個帶有PropTypes和所有生命周期方法以及ES6模塊系統的React組件類
  • rcjc+tab鍵:用ES6模塊系統創建一個React組件類(無導出)
  • rdp+tab鍵:快速生成defaultProps
  • rpc+tab鍵:用PropTypes和ES6 moudle系統創建一個React純組件類
  • rrc+tab鍵:創建一個連接到redux的React組件類
  • rrdc+tab鍵:創建一個通過dispatch連接到redux的React組件類
  • rsc+tab鍵:創建沒有PropTypes和ES6模塊系統的無狀態React組件
  • rscp+tab鍵:創建有PropTypes和ES6模塊系統的無狀態React組件
  • rsf+tab鍵:以命名函數的形式創建無狀態的React組件,不使用PropTypes
  • rsfp+tab鍵:使用PropTypes將無狀態的React組件作為命名函數創建
  • rsi+tab鍵:創建無狀態的React組件,不使用PropTypes和ES6模塊系統,但使用隱式返回和道具
  • rwwd+tab鍵:在沒有導入的情況下,在ES6模塊系統中創建一個有構造函數、空狀態、proptypes和導出的React組件類。(主要用于React時,proptype由webpack提供插件提供)

組件化編碼

我們通過前面應該也能認識到,我們寫react,包括npm運行react,其實都是從index.js入口文件開始,那么index.js的格式至關重要

//引入核心庫
import React from 'react';
//引入dom庫
import ReactDOM from 'react-dom';
//引入組件
import Hello from './components/Hello';
ReactDOM.render(<Hello />,document.getElementById('root'))

拆分組件的原則

  • 單一職責原則:每個組件只負責一項功能,這樣可以使組件的代碼更加簡潔易讀,并且方便維護和重用。

  • 可復用性:每個組件都應該盡量獨立,以便在其他地方重復使用。

  • 組件之間的耦合度:組件之間應該盡量避免耦合,這樣可以使得組件的代碼更加靈活,便于維護和修改。

  • 讓組件盡可能小:盡可能使組件的代碼行數少,這樣可以使代碼更易讀,并且方便維護。

  • 可讀性:組件的代碼應該有良好的結構,并且有適當的注釋,便于閱讀和理解。

案列 TodoList

頁面渲染

我先把一個沒有任何功能的頁面渲染出來,給一些初始數據

  • 我們在入口文件中,分別聲明 引入的核心文件,dom庫,和組件
//引入核心庫
import React from 'react';
//引入dom庫
import ReactDOM from 'react-dom';
//引入組件
import App from "./App";
ReactDOM.render(<App />,document.getElementById('root'))
  • 在App組件初始化一些數據并返回頁面結構,并將初始化數據通過props傳給list
import React, {Component} from 'react';
import "./App.css"
import Header from "./components/Header/Header"
import Footer from "./components/Footer/Footer"
import List from "./components/List/List"
class App extends Component {//初始狀態state={todos:[{id:1,text:"吃飯",done:false},{id:2,text:"睡覺",done:false},{id:3,text:"打豆豆",done:false},{id:4,text:"看動畫",done:false}]}render() {return (<div className="todo-container"><div className="todo-wrap">{/*引入header組件*/}<Header />{/*引入list組件*/}<List data={this.state.todos} />{/*引入Footer組件*/}<Footer /></div></div>);}
}export default App;
  • List.jsx
import React, {Component} from 'react';
import Item from "../Item/Item";
import "./List.css"
class List extends Component {//限制屬性類型render() {const todos = this.props.data;return (<ul className="todo-main">{todos.map((todo, index) => {// 將todo對象作為props傳給Item組件  ...默認和對象同名return <Item key={todo.id} {...todo}></Item>;})}</ul>);}
}export default List;
  • Item.jsx
import React, {Component} from 'react';
import "./Item.css"class Item extends Component {render() {const {id,text,done}=this.propsreturn (<li style={{backgroundColor: 'white'}}><label ><input type="checkbox"/><span>{text}</span></label><button className="btn btn-danger" style={{display:'none'}}>刪除</button></li>);}
}
export default Item;
  • Header.jsx
import React, {Component} from 'react';class Header extends Component {render() {return (<div className="todo-header"><input type="text" placeholder="請輸入你的任務名稱,按回車鍵確認"/></div>);}
}
export default Header;
  • Footer.jsx
import React, {Component} from 'react';class Footer extends Component {render() {return (<div className="todo-footer"><label><input type="checkbox"/><span><span>已經完成2/全部5</span></span></label><button className="btn btn-danger">清除已完成任務</button></div>);}
}export default Footer;
  • 最終樣式如下
    在這里插入圖片描述

功能實現

鼠標懸浮

  • 首先我們來實現第一個功能,從簡單功能入手,鼠標懸浮,列表背景色變色,并展示刪除按鈕,觸發事件是onMouseEnter,鼠標離開恢復原狀,觸發事件是onMouseLeave,展示是否完成的狀態,我們開始編寫
class Item extends Component {//定義狀態state={mouse:false}//接收參數handleMouse=(flag)=>{return ()=>{this.setState({mouse:flag})}}render() {const {id,text,done}=this.propsconst flag=this.state.mousereturn (                                                                  //傳入參數<li style={{backgroundColor: flag?'#ddd':'white'}} onMouseEnter={this.handleMouse(true)}onMouseLeave={this.handleMouse(false)}><label ><input type="checkbox" checked={done}/><span>{text}</span></label><button className="btn btn-danger" style={{display:flag?'block':'none'}}>刪除</button></li>);}
}

勾選和刪除

  • 實現勾選和刪除功能,當點擊選中按鈕的時候,觸發的操作是onChange,刪除按鈕的觸發事件是onClick,我們來實現一下,因為我們操作的數據來源于App.jsx的state,為了方便操作數據,我們將方法寫在App.jsx里面,然后通過props傳遞給組件
    updateTodo=(id,done)=>{const todos=this.state.todos//遍歷找到對應的todo,創建一個新的數組對象const newTodos=todos.map((todo)=>{if (todo.id===id){//改變狀態return {...todo,done:done}}else{return todo}})this.setState({todos:newTodos})}deleteTodo=(id)=>{const todos=this.state.todosconst newTodos=todos.filter((todo)=>{return todo.id !==id})this.setState({todos:newTodos})}
  • Item.jsx
    handelChange=(id)=>{return (e)=>{//根據id和checked狀態更新數據this.props.updateTodo(id,e.target.checked)}}del=(id)=>{return ()=>{this.props.deleteTodo(id)}}render() {const {id,text,done}=this.propsconst flag=this.state.mousereturn (                                                                  //傳入參數<li style={{backgroundColor: flag?'#ddd':'white'}} onMouseEnter={this.handelMouse(true)}onMouseLeave={this.handelMouse(false)}><label ><input type="checkbox" checked={done}  onChange={this.handelChange(id)}/><span>{text}</span></label><button className="btn btn-danger" onClick={this.del(id)} style={{display:flag?'block':'none'}}>刪除</button></li>);}

添加

  • 接下來我們再實現一個添加todo的功能,觸發事件就是Onkeyup
    App.js
    addTodo=(todo)=>{const todos=this.state.todosconst newTodos=[...todos,todo]console.log(newTodos);this.setState({todos:newTodos})}

header.jsx

    addTodo = (e) => {// console.log(e);const {keyCode, target} = eif (keyCode === 13) {const todo = {id: nanoid(),text: target.value,done: false}// console.log(todo);this.props.addTodo(todo);target.value = '';}}

全選和一鍵清除

  • app.js
    checkAll=(bool)=>{//全選或者取消全選const todos=this.state.todosconst newTodos=todos.map((todo)=>{return {...todo,done:bool}})this.setState({todos:newTodos})}delAll=()=>{const todos=this.state.todosconst newTodos=todos.filter((todo)=>{return !todo.done})this.setState({todos:newTodos})}
  • footer.jsx
class Footer extends Component {state = {checked: false};//如果是狀態false 點擊后全選中checkAll = () => {const  checked=this.state.checked;this.props.checkAll(!checked);this.setState({checked: !this.state.checked});};delAll = () => {this.props.delAll();};render() {const {todos} = this.props;const total=todos.lengthconst doneCount=todos.reduce((prev,cur)=>{return prev+(cur.done?1:0);},0)return (<div className="todo-footer"><label><input onChange={this.checkAll} checked={this.state.checked} type="checkbox"/><span><span>已經完成{doneCount}/全部{total}</span></span></label><button className="btn btn-danger" onClick={this.delAll}>清除已完成任務</button></div>);}
}

react的事件監聽大全

react所有事件監聽

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/696752.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696752.shtml
英文地址,請注明出處:http://en.pswp.cn/news/696752.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

全棧筆記_瀏覽器擴展篇(插件開發 - chrome瀏覽器proxy代理)

代理類型 常用的包括http、https、socks代理 配置權限 要讓擴展使用代理接口,需要聲明proxy權限: // manifest.json "permissions": ["proxy" ]設置代理服務器 chrome.proxy.settings.set({ scope: ‘regular’, value: 代理配置},回調函數) 代理配…

【前端面經2】京東一面

題目來源&#xff1a;牛客網 自我介紹 動態參數解析的解決方案 對于動態部分使用…args進行接受&#xff0c;可以把動態部分提取成數組 前端安全問題 CDN劫持 內容安全策略CSP 安全沙箱 Iframe 跨站腳本攻擊XSS 攻擊者通過在目標網站上注入惡意腳本&#xff0c;使之在…

OpenHarmony驅動框架HDF中設備管理服務構建過程詳解

前言 如下圖&#xff0c;開源鴻蒙系統驅動框架HDF在內核中的實現&#xff0c;可以分為向用戶層提供設備服務的管理模塊&#xff08;Manager&#xff09;&#xff0c;和實際管理硬件的Host模塊。 Manager分為DeviceManageService和 DeviceServiceManage&#xff0c;前者負責提供…

1.WEB滲透測試-前置基礎知識-ip地址

ip地址&#xff1a; ip地址指的是互聯網協議地址&#xff0c;是IP協議提供的一種統一的地址格式&#xff0c;以每一臺聯網的主機都有一個對應的ip地址&#xff0c;ip地址也可以理解為分配給用戶上網使用的網際協議的設備的數字標簽。通俗的來說就是你打電話時候的每個人都有自己…

AIGC 實戰:如何使用 Docker 在 Ollama 上離線運行大模型(LLM)

Ollama簡介 Ollama 是一個開源平臺&#xff0c;用于管理和運行各種大型語言模型 (LLM)&#xff0c;例如 Llama 2、Mistral 和 Tinyllama。它提供命令行界面 (CLI) 用于安裝、模型管理和交互。您可以使用 Ollama 根據您的需求下載、加載和運行不同的 LLM 模型。 Docker簡介 D…

在Mac上搭建MongoDB環境

最近工作中需要裝MongoDB環境&#xff0c;搭建過程中遇到了一些問題&#xff0c;在這里記錄一下安裝MongoDB環境的方法以及問題的解決方法。有兩種安裝MongoDB的方法&#xff1a;brew安裝和手動安裝。 目錄 使用Homebrew安裝MongoDB 手動安裝MongoDB&#xff08;不使用Homebr…

備戰藍橋杯 Day11(滾動數組優化+完全背包)

01背包的滾動數組優化 【題目描述】 經典0—1背包問題,有n個物品&#xff0c;編號為i的物品的重量為w[i]&#xff0c;價值為c[i]&#xff0c;現在要從這些物品中選一些物品裝到一個容量為m的背包中&#xff0c;使得背包內物體在總重量不超過m的前提下價值盡量大。 #include&…

python_數據分析_numpy庫

一、創建ndarray *ndarray是NumPy中表示數組的重要類型 1、使用np.array()創建 *參數列表&#xff1a;[1,2,3,4] 注&#xff1a;(1)、numpy默認ndarray的所有元素的類型是相同的 ? (2)、如果傳入的數據類型不同&#xff0c;會被按照優先級強制轉換為同一類型&#xff0c;其…

vue--兩種定時任務cron表達式組件比較選擇

背景&#xff1a; 使用vue頁面中cron表達式的組件&#xff0c;實現定時任務參數配置。 方案1 vue-cron 安裝插件 npm install vue-cron --save 全局引入&#xff0c;修改main.js import Vue from vue import VueCron from vue-cron Vue.use(VueCron);頁面配置 html<el-…

Java入門-可重入鎖

可重入鎖 什么是可重入鎖? 當線程獲取某個鎖后&#xff0c;還可以繼續獲取它&#xff0c;可以遞歸調用&#xff0c;而不會發生死鎖&#xff1b; 可重入鎖案例 程序可重入加鎖 A.class,沒有發生死鎖。 sychronized鎖 package com.wnhz.lock.reentrant;public class Sychroniz…

多普勒變化率的應用 與 FPGA

1.多普勒變化率是一個描述波源和觀察者相對速度變化的物理量&#xff0c;它與加速度有關。 多普勒效應是指當波源和觀察者之間存在相對運動時&#xff0c;觀察者接收到的波頻率與波源發射的頻率之間的差異。這種現象在聲波、電磁波等多種波動中都會出現。多普勒變化率通常用來…

linux系統內核升級

1.查看舊版本內核 2.導入密鑰 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org 3.安裝yum源 rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm4.啟用elrepo-kernel倉庫并安裝最新內核版本 yum --enablerepoelrepo-kernel install …

一文弄明白KeyedProcessFunction函數

引言 KeyedProcessFunction是Flink用于處理KeyedStream的數據集合&#xff0c;它比ProcessFunction擁有更多特性&#xff0c;例如狀態處理和定時器功能等。接下來就一起來了解下這個函數吧 正文 了解一個函數怎么用最權威的地方就是 官方文檔 以及注解&#xff0c;KeyedProc…

c++實現棧和隊列類

c實現棧和隊列類 棧(Stack)Stack示意圖Stack.cpp 隊列(queue)queue 示意圖queue.cpp 棧(Stack) Stack示意圖 Stack.cpp #pragma once #include "ListStu.cpp"template<typename T> class Stack { public: /* * void push(T& tDate)* 參數一 &#xff1a;…

【OCR專題文章】

目錄 一、數據獲取及預處理方法篇 二、兩階段算法篇(檢測識別) 三、一階段算法篇(Enc-Dec) 四、拓新篇 本欄聚焦在OCR的相關算法&#xff0c;專欄內文章的代碼均已實現。 一、數據獲取及預處理方法篇 【數據獲取】 合同數據獲取&#xff1a;【OCR】【專題系列】二、數據獲取-…

解決windows無法訪問wsl下docker服務

筆者在初學使用wsl跑docker時,遇到了windows無法訪問的問題,并且瀏覽了大部分的文章,發現并沒有起效,在反復試錯終于成功之后,總結為以下幾點: 1.升級至wsl2 2.將.wslconfig文件(用戶文件夾下)中的如下鏡像服務關閉刪除 networkingModemirrored 3.打開wsl防火墻相應的端口 …

記錄解決uniapp使用uview-plus在vue3+vite+ts項目中打包后樣式不能顯示問題

一、背景 從 vue2uview1 升級到 vue3vitetsuview-plus ,uview組件樣式打包后不顯示&#xff0c;升級前uview 組件是可以正常顯示&#xff0c;升級后本地運行是可以正常顯示&#xff0c;但是打包發布成H5后uview的組件無法正常顯示&#xff0c;其他uniapp自己的組件可以正常顯示…

Vue 中 onclick和@click區別

文章目錄 一、直接上結論二、驗證代碼&#xff0c;可直接運行三、點擊結果 一、直接上結論 onclick 只能觸發 js的原生方法&#xff0c;不能觸發vue的封裝方法click 只能觸發vue的封裝方法&#xff0c;不能觸發js的原生方法 二、驗證代碼&#xff0c;可直接運行 <!DOCTYP…

Vue3 + Ts (使用lodash)

安裝 npm i --save lodash使用 import _ from lodash??報警告&#xff1a;&#xff01;&#xff01;&#xff01; 此時還需要安裝ts聲明文件庫 npm install types/lodash -D安裝之后重啟Vscode還是會提示上面的警告&#xff0c;此時還需在tsconfig.ts里面配置 {"c…

快速將excel/word表格轉換為web頁面(html)的方法

前言 在進行開發企業信息化建設的過程&#xff0c;應該有很多這樣的場景&#xff0c;就是將現有的電子表格記錄的方式轉換為在數據系統中進行網頁上報。也就是需要根據當前一直使用的表格制作一個上傳這個表格信息的網頁&#xff0c;如果要減少系統的使用學習成本&#xff0c;…