本文譯自:30-seconds-of-react。React 30 秒速學:全篇中文翻譯、學習,地址:30-seconds-of-react-zh_CN-umi,全部案例進行分析、註釋、上線。react
系列文章:git
輸入框組件,使用回調函數將其值傳遞給父組件。github
<input>
元素的某些屬性的默認值。<input>
元素,並使用onChange
事件中的callback
函數將輸入值傳遞給父元素。function Input({ callback, type = 'text', disabled = false, readOnly = false, placeholder = '' }) {
return (
<input type={type} disabled={disabled} readOnly={readOnly} placeholder={placeholder} // event.target.value onChange={({ target: { value } }) => callback(value)} /> ); } 複製代碼
export default function() {
return <Input type="text" placeholder="Insert some text here..." callback={val => console.log(val)} />; } 複製代碼
ps:數組
使用「顯示」按鈕呈現密碼輸入字段。瀏覽器
React.useState()
鉤子建立shown
狀態變量並將其值設置爲false
。div>
包裝<input>
和<button>
元素,用於切換text
和password
之間輸入字段的類型。function PasswordRevealer({ value }) {
const [shown, setShown] = React.useState(false);
return (
<div> <input type={shown ? 'text' : 'password'} value={value} onChange={() => {}} /> <button onClick={() => setShown(!shown)}>顯示/隱藏</button> </div> ); } 複製代碼
export default function() {
return <PasswordRevealer />; } 複製代碼
ps:ide
呈現滑塊元素,使用回調函數將其值傳遞給父組件。函數
<input>
元素的某些屬性的默認值。range
的<input>
元素和相應的屬性,使用onChange
事件中的callback
函數將輸入值傳遞給父元素。function Slider({ callback, disabled = false, readOnly = false }) {
return (
<input type="range" disabled={disabled} readOnly={readOnly} onChange={({ target: { value } }) => callback(value)} /> ); } 複製代碼
export default function() {
return <Slider callback={val => console.log(val)} />; } 複製代碼
ps:post
呈現一個複選框列表,該列表使用回調函數將其選定的值/值傳遞給父組件。學習
React.setState()
建立一個data
狀態變量,並將其初始值設置爲等於options
。toggle
,用於切換checked
以更新data
狀態變量,並調用經過組件的props傳遞的onChange
回調。<ul>
元素並使用Array.prototype.map()
將data
狀態變量映射到單獨的<li>
元素,其中<input>
元素做爲它們的子元素。<input>
元素都有type ='checkbox'
屬性並被標記爲readOnly
,由於它的click事件由父<li>
元素的onClick
處理程序處理。const style = {
listContainer: {
listStyle: 'none',
paddingLeft: 0
},
itemStyle: {
cursor: 'pointer',
padding: 5
}
};
function MultiselectCheckbox({ options, onChange }) {
const [data, setData] = React.useState(options);
const toggle = item => {
data.map((_, key) => {
if (data[key].label === item.label) data[key].checked = !item.checked;
});
setData([...data]);
onChange(data);
};
return (
<ul style={style.listContainer}> {data.map(item => { return ( <li key={item.label} style={style.itemStyle} onClick={() => toggle(item)}> <input readOnly type="checkbox" checked={item.checked || false} /> {item.label} </li> ); })} </ul> ); } 複製代碼
export default function() {
const options = [{ label: "Item One" }, { label: "Item Two" }];
return (
<MultiselectCheckbox options={options} onChange={data => { console.log(data); }} /> ); } 複製代碼
ps:ui
呈現一個<select>
元素,該元素使用回調函數將其值傳遞給父組件。
<select>
元素的某些屬性的默認值。<select>
元素,並使用onChange
事件中的callback
函數將textarea的值傳遞給父元素。values
數組上使用destructuring來傳遞value
和text
元素的數組以及selected
屬性來定義<select>
元素的初始value
。function Select({ values, callback, disabled = false, readonly = false, selected }) {
const [current, setCurrent] = React.useState(selected);
const handleChange = ({ target: { value } }) => {
setCurrent(value);
callback(value);
};
return (
<select value={current} disabled={disabled} readOnly={readonly} onChange={handleChange} > {values.map(([value, text]) => ( <option value={value} key={value}> {text} </option> ))} </select>
);
}
複製代碼
export default function() {
let choices = [
["grapefruit", "Grapefruit"],
["lime", "Lime"],
["coconut", "Coconut"],
["mango", "Mango"]
];
return (
<Select values={choices} selected={"lime"} callback={val => { console.log(val); }} /> ); } 複製代碼
ps: 這裏的實現跟官方不一樣,官方使用 option 的 selected 屬性,但瀏覽器報錯說不該使用,故更改成 select 的 value 屬性。