React基礎學習(第三天)

條件渲染

1. if / else

  render () {if (this.state.isLoading) { // 正在加載中return <h1>Loading...</h1>}return <div>這就是我們想要的內容</div>}
// 鉤子函數 五秒鐘之后 修改狀態值componentDidMount () { setTimeout(() => {this.setState({isLoading : false})}, 3000);}

2. 三元表達式

 return this.state.isLoading ? (<h1>Loading...</h1>) : (<div>這就是我們想要的內容</div>)

3. 邏輯運算符

 return this.state.isLoading && (<h1>Loading...</h1>) 

列表渲染

遍歷1

// 準備數據
state = {list :['小蘋果','大香蕉','黃橙子']
}return (<ul>{this.state.list.map(item => { return <li>{ item }</li>}) }
</ul>)

遍歷2

// 準備數據
state = {list2: [{ id: 1, name: '春' }, { id: 2, name: '飛' }, { id: 3, name: '蓮' }]
}
// 遍歷return (<ul>{this.state.list2.map(item => { return <li key={item.id}>{ item.name }</li>}) }</ul>)

提取到函數

// render 鉤子函數
render () {return (<ul>{ this.renderLi()  }</ul>)}// 提取到的一個函數
// 必須要有返回值
renderLi () { return this.state.list2.map(item => { return <li key={item.id}>{ item.name }</li>}) 
}

處理樣式

行內樣式

// 這個{{}} 不是雙括號語法,  而是單括號里面有個 樣式對象
//{} 可以拿到原始類型
<div style={{ color: 'pink', backgroundColor: 'yellowgreen', height: 300 }}>

外聯樣式

//1. 外部 index.css
.red {color: red;font-size: 50px;
}//2. 引入
import './index.css'//3. 添加類<p className='red' >哈哈</p>

評論案例

步驟

  • 準備數據 - 列表展示

  • 受控組件

  • 表單頭部展示收集數據

  • 補充 : 非受控組件

評論案例1 : 列表展示

  • 準備數據
 list: [{ id : 1, username :'張三', content :'做一個凡人' },{ id : 2, username :'李四', content :'貪財好色' },{ id : 3, username :'王五', content :'一身正氣' }],
  • 展示
<ul>{this.state.list.map(item => { return (<li key={item.id}><p>評論人 : {item.username}</p><p>評論內容 : {item.content}</p></li>)}) }
</ul>

評論案例2 : 受控組件

  • 見下面的受控組件模塊

評論案例3 : 頭部展示

  • 結構
<div>評論的人 :<inputonChange={e => this.getValues('username', e.target.value)}    # +name="username"value={username}style={{ width: '214px' }}type="text"/><br />評論內容 :<textareaonChange={e => this.getValues('content', e.target.value)}    # +name="content"value={content}cols="30"rows="10"></textarea><button onClick={this.add}>添加評論</button>
</div>
  • 處理表單數據
getValues = (name, value) => {this.setState({[name]: value})
}
  • 添加評論
  add = () => { // 獲取數組const { list, content, username } = this.state let obj = {id: +new Date(),content,name : username}this.setState({list: [obj, ...list],content: '',username :''}) }

評論案例4 : 非受控組件

  • 見 下面 非受控組件模塊

受控組件

導入 : 給 input 添加了一個value ,展示默認值

受控組件介紹

  • 表單元素 是用來收集數據的

  • react 表單元素分為 : 受控組件 + 非受控組件

  • 受控組件 : 受 React 控制的組件

  • 如何成為受控組件 ? 給 input 添加value 值, 那么這個input 就成了受控組件

  • M ==> V , V ==> M (我們自己處理)

- 1.需要給 input 添加 value 并且賦值 =>  M ==> V
- 2.onChange={ this.handleInput } ==> 監聽 V 的數據變化, 收集值賦值給 M  
- 3. handleInput = (e) =>  {// 監聽input 的變化//  (V) 拿到文本框的值, 修改 state 里面的數據(M)console.log(e,target.value)// 修改狀態this.setState({username : e.target.value})}

其他表單處理受控組件

// 文本輸入框
<input onChange={this.handleInput} value={username} type="text" />  <br />
// 文本域
<textarea onChange={this.handleTextarea} value={content} cols="30" rows="10"></textarea>
// 下拉框
<select value={city} onChange={this.handleSelect}><option value="sh">上海</option><option value="hz">杭州</option><option value="bj">北京</option>
</select>
  • 處理
  // 處理 input handleInput  = (e) => { this.setState({username: e.target.value})}// 同上
.....

優化1

// 讓其他表單都綁定到一個事件中
// 文本輸入框
<input name='username' onChange={this.handleInput} value={username} type="text" />  <br />
// 文本域
<textarea name='content' onChange={this.handleTextarea} value={content} cols="30" rows="10"></textarea>
// 下拉框
<select name='city' value={city} onChange={this.handleSelect}><option value="shanghai">上海</option><option value="hangzhou">杭州</option><option value="beijing">北京</option>
</select>
  • 處理
  handle = e => { // console.log(e.target.name);this.setState({[e.target.name] : e.target.value})}

優化2

// 文本輸入框
<input  onChange={(e) => this.getValues('username', e.target.value)} value={username} type="text" />  <br />
// 文本域
<textarea onChange={(e) => this.getValues('content', e.target.value)} value={content} cols="30" rows="10"></textarea>
// 下拉框
<select value={city} onChange={ (e) => this.getValues('city', e.target.value) }><option value="shanghai">上海</option><option value="hangzhou">杭州</option><option value="beijing">北京</option>
</select>
  • 處理
 getValues = (name, value) => { this.setState({[name] : value})}

非受控組件

導入 : 如果不想讓inptu 成為受控組件 , 又想添加默認值

####非受控組件介紹:

  • 添加 defaultValue : <input type="text" defaultValue={this.state.name} />
  • 它默認就是一個非受控組件
  • 非受控組件操作 DOM 直接獲取 數據 – 通過 ref

使用步驟

  • 1-創建 ref 引用
constructor(){super()// 方式1this.iptRef = React.createRef()
}
// 和 state 一樣
// 方式2: 屬性初始化語法
iptRef = React.createRef()
  • 2-綁定 ref
<input ref={ this.iptRef } />
  • 3-獲取數據
// 可以通過嘗試點擊按鈕
click = () => {console.log(this.iptRef.current.value)
}

組件通訊

父傳子

  • 通過普通的props屬性傳遞, 實現父傳子即可
// 父組件
class Parent extends React.Component {// 1. 準備好數據state = {pName : '父的數據'}render() {return (<div><p>哈哈</p>//2. 通過屬性 將數據傳遞給子組件<Child name={this.state.pName}></Child></div>)}
}
// 子組件  
// 3. 通過 props 獲取數據
const Child = (props) => <div>子組件 { props.name }</div>

子傳父

  • 思路 : 父組件中提供了一個方法, 由子組件調用這個方法, 將數據作為參數傳遞給父組件
  • 步驟 :
    • 1-在父組件中提供一個方法
    • 2-將這個方法通過屬性傳遞給子組件
    • 3-子組件中通過props 拿到這個方法調用, 并且將數據作為參數傳遞
// 父組件
class Parent extends React.Component {// 第一步 :父組件準備一個方法pFn = (data) => { console.log('調用了',data);}render() {return (<div><p>哈哈</p>{/* 第二步 : 通過屬性將方法產傳遞給子組件 */}<Child cfn={ this.pFn } ></Child></div>)}
}
// 子組件  
class Child extends React.Component { render () { return (<div><button onClick={this.sendMsg}>點擊發送</button></div>)}sendMsg = () => { // 第三步 : 子組件通過props 拿到這個方法, 并且傳參this.props.cfn('撩漢子')}
}

兄弟組件通訊

  • 思路 : 狀態提升

改造評論案例 ★

  • 組件化

    • index.js => Comments父組件
    • components/
      • CommentsList.js ==> CommentsList 列表組件
      • CommentsLForm.js ==> CommentsLForm 表單組件
  • 父傳子 => 把 list 傳給 CommentsList 組件 => 遍歷展示列表

  • 子傳父 => 把表單里的數據新對象 => 點擊添加評論 => 傳給 Comments組件

  • pGetData

  • 添加評論

context

  • 使用場景 : 跨多層組件傳遞數據
    • 如果兩個組件是 遠房親戚 的關系,此時,就可以使用 Context 來通訊。
  • 畫圖 : One > Two > Three > Four
  • Context 中提供了兩個組件
    • Provider 組件 : 提供組件, 提供數據
    • Consumer 組件 : 消費組件, 接收數據
// 1. 創建 Context 對象, 并解構出來兩個組件
const { Provider, Consumer } = React.createContext()    # +//2. 類組件
class One extends React.Component {state = {color :'red'}render() {return (// 第二步 : 使用 Provider 組件包裹 one組件, 只有被包裹的部分里面才能獲取數據 // 通過 value 屬性提供要共享的數據<Provider value={ this.state.color }>          # +<div><p> One </p><Two></Two></div></Provider>)}
}
class Two extends React.Component {
....
}
class Three extends React.Component {....
}
class Four extends React.Component {render() {return (<div><p>Four</p>{/* 3.在 Four 組件中, 通過 consumer 來獲取數據 */}{/* 遵循的是 render-props 思想 后面介紹 */}<Consumer>{data => { return <p style={{ color : data }} >這是測試用的</p>   # +}}</Consumer></div>)}
}

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

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

相關文章

componentsJoinedByString 和 componentsSeparatedByString 的方法的區別

將string字符串轉換為array數組 NSArray *array [Str componentsSeparatedByString:","]; &#xff1d;&#xff1d;反向方法 將array數組轉換為string字符串 NSString *tempString [mutableArray componentsJoinedByString:","];--,是分隔符 可不加分隔…

java中的各種數據類型在內存中存儲的方式

轉載別人的附上鏈接&#xff1a;https://blog.csdn.net/zj15527620802/article/details/80622314 1.java是如何管理內存的 java的內存管理就是對象的分配和釋放問題。&#xff08;其中包括兩部分&#xff09; 分配&#xff1a;內存的分配是由程序完成的&#xff0c;程序員需要通…

vscode的 jsonp 配置文件

{ // 工具-字體大小 “editor.fontSize”: 15, // 工具-tab縮進 “editor.tabSize”: 2, // 工具-在視區寬度換行 “editor.wordWrap”: “on”, // 工具-縮放 “window.zoomLevel”: 1, // 工具-編寫tab識別語言格式 “emmet.includeLanguages”: { “vue-html”: “html”, “…

NSString拼接字符串和NSPredicate詳解

NSString* string; // 結果字符串 02 NSString* string1, string2; //已存在的字符串&#xff0c;需要將string1和string2連接起來 03 04 //方法1. 05 string [[NSString alloc]initWithFormat:"%,%", string1, string2 ]; 06 07 //方法2. 08 string [string1 …

線程模塊

信號量 from threading import Semaphore,Thread import timedef func(a,b):time.sleep(1)sem.acquire()print(ab)sem.release()sem Semaphore(4) for i in range(10):t Thread(targetfunc,args(i,i5))t.start() 信號量事件 # 事件被創建的時候&#xff0c;默認為False狀態 #…

React中級學習(第一天)

Props深入 children 作用 : 獲取組件標簽的 子節點獲取方式 : this.props.children <App>此處的內容&#xff0c;就是組件的 children&#xff0c;將來通過組件的 props.children 就可以獲取到這些子節點了 </App>props 校驗 作用&#xff1a;規定組件props的類…

iOS 正則表達式判斷純數字以及匹配11位手機號碼

1用正則表達式 //是否是純數字(BOOL)isNumText:(NSString *)str{NSString * regex "(/^[0-9]*$/)";NSPredicate * pred [NSPredicate predicateWithFormat:"SELF MATCHES %", regex];BOOL isMatch [pred evaluateWithObject:st…

Elasticsearch集成ik分詞器

1、插件地址https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.0.0/elasticsearch-analysis-ik-7.0.0.zip 2、找到對應版本的插件通過 http://192.168.1.8:9200查看ES的版本&#xff0c;找到對應的IK分詞插件 下載與之對應的版本https://github.com/me…

React中級學習(第二天)

JSX 語法的轉化過程 (了解) 演示 : babel中文網試一試 let h1 JSX 僅僅是createElement() 方法的語法糖 (簡化語法)JSX 語法 被 babel/preset-react 插件編譯為 createElement() 方法React 元素&#xff1a;是一個對象&#xff0c;用來描述你希望在屏幕上看到的內容React 元素…

【】MTCNN基于NCNN的測試過程

前言 操作過程 NCNN: https://github.com/Tencent/ncnn/wiki/how-to-build#build-for-linux-x86; vector初始化&#xff1a;int num[4] { 1, 4, 3, 2 }; int numLength sizeof(num) / sizeof(num[0]); vector<int> nums(num, num numLength); //使用數組初始化向量 Q&…

iOS NSTextAttachment - 圖文混排

蘋果在iOS7中推出了一個新的類NSTextAttachment&#xff0c;它是做圖文混排的利器&#xff0c;本文就是用這個類&#xff0c;只用50行代碼實現文字與表情混排&#xff0c;當然也可以實現段落中的圖文混排。 首先說一下文字和表情的混排&#xff1a; 先來做點兒準備工作&#…

vuex的結構有哪些參數?

查看參考地址&#xff1a; https://vuex.vuejs.org/zh/ vuex 狀態管理模式&#xff0c;相當于數據的中間商 注意&#xff1a; 為相同 屬性有&#xff1a; 1.State vue中的data —> 存放數據 2.Getter vue中的計算屬性computed —>將已有的數據進行計算再次利用 3.…

百煉OJ - 1004 - 財務管理

題目鏈接&#xff1a;http://bailian.openjudge.cn/practice/1004/ 思路 求和取平均。。。 #include <stdio.h>int main() {float sum0,a;for(int i0;i<12;i){scanf("%f",&a);sum a;}printf("$%.2f\n",sum/12);return 0; } 轉載于:https://w…

iOS 自定義Cell按鈕的點擊代理事件

在實際開發工作中&#xff0c;我們經常會在自定義的Cell中布局一些按鈕&#xff0c;并且很多時候我們會在點擊這個按鈕的時候使我們的UItableviewController跳轉到下一界面&#xff0c;有的可能還要傳值。那么如何使我們的控制器能夠獲知我們按下了cell的按鈕呢&#xff1f;毫無…

Google 開源技術protobuf 簡介與樣例

今天來介紹一下“Protocol Buffers ”&#xff08;以下簡稱protobuf&#xff09;這個玩意兒。本來俺在構思“生產者/消費者模式 ”系列的下一個帖子&#xff1a;關于生產者和消費者之間的數據傳輸格式。由于里面扯到了protobuf&#xff0c;想想干脆單獨開一個帖子算了。 ★prot…

VUE全局導航守衛、 請求、響應攔截器 的設置

文件設置參考地址&#xff1a;https://gitee.com/wang_yu5201314/headlines__news/tree/master/%E9%A1%B9%E7%9B%AE%E6%BA%90%E7%A0%81%E6%96%87%E4%BB%B6/src 文件夾 Router 文件夾 index.js 中設置 全局導航守衛 文件 mian.js 中設置 請求、響應攔截器 設置 請求、響應攔截器…

JRE System Library和 Referenced Libraries 的區別和來源

JRE System Library 安裝jdk后&#xff0c;會有個目錄叫做jrejre目錄是核心類庫&#xff0c;目錄中裝的是類庫文件jre System Library顧名思義就表示系統類庫文件 Referenced Libraries referenced libraries放的是你引用的jar包&#xff0c;這個不需要自己創建的&#xff0c;你…

ByteArray、16進制、字符串之間的轉換

ByteArray、16進制、字符串之間的轉換&#xff1a; package fengzi.convert {import flash.utils.ByteArray;public class ByteArrayTranslated{/**** 通過hax數據返回ByteArray* param hax 格式 "AA5A000100FF"***/public static functi…

js - (初中級)常見筆試面試題

1.用 js 實現一個深拷貝 2.用 js 寫一個數組去重 3. 用 js 對字符串進行反轉 4. 用 js 請求范圍內的質數個數 5.用 js 求數組中出現最多的數及其出現次數

iOS 支付寶SDK接入詳解

一&#xff0c;在支付寶開放平臺下載支付寶SDK&#xff08;https://openhome.alipay.com/platform/document.htm#down&#xff09; https://doc.open.alipay.com/doc2/detail.htm?spma219a.7629140.0.0.HpDuWo&treeId54&articleId104509&docType1 二&#xff0c;添…