YouTube APIクライアントの使用(2)
23974 ワード
App.jsで親コンポーネントが作成された以上、サブコンポーネントが作成されます.
(サブアセンブリを作成する方法はまだありません.サブアセンブリを作成するときに1つずつ追加されます.) Nav.js はアプリケーションです.これはjsからgetYouTubeVideos(query)を取得したpropsです.
query(検索値)、youtube apiキー、および最大検索数(max)をoptionsオブジェクトに含め、searchYoutube(options,callback)メソッドを実行します.
ビデオの構造とサーバ呼び出し情報は、他の記事で説明します.
{handleSettingButtonClick}はAppです.これはjsからもらったhandleSettingButtonClick()の道具です.設定ボタンをクリックしてstateに入ります.isSettings Open値をfalse、trueに変更します.
Settingsはクラス要素です.App.jsではisSettings Open、handleSettings ButtingButtonClick、handleUpdateSettings、currentUser状態を受信します.
NavでisSettings Openの状態を変更すると、左側からSettings構成部品が表示されなくなります. handleChangeName()はinputが持つ値thisです.state.ユーザー名の値が変更されるたびに実行されます.
usernameはpropsを開始値とします.user.親アプリケーションとして名前で保存します.jsのprops user.名前を意味します.すなわち、開始値は「金符号化」である.
onChangeは、値を変更するたびに発生するイベントです. HandleSave()はSettingsです.jsのメソッドを使用してonClickで実行するメソッド.
App.jsのstateをpropsとするhandleUpdateSettings()を実行して設定します.jsのstate.アプリケーションのユーザー名.jsのstate.currentuser.name値を使用します. handleToggleDarkMode()は、チェックボックスの状態が変化したときに実行される方法です.Setting.jsメソッド、アプリケーション.jsのhandleUpdateSettings()を実行し、画面をDarkModeに変更します. handleUpdateSettingsは上のhandleSave()でも使用されています.状態変更方法の再利用という点では良いコードだと思います. cssを見てください.main.黒瓦navbar.暗いランプなどの暗いモードでは、特定のレベルのマウスが色を変えています.
App.jsを含むすべてのコンポーネントタグのうち、className={this.state.darkMode?[a]:[b]}を持つタグのステータスはhandleUpdateSettingsに変更され、cssも変更されます.
(サブアセンブリを作成する方法はまだありません.サブアセンブリを作成するときに1つずつ追加されます.)
//함수 컴포넌트 형식, props를 사용하고 하위 컴포넌트의 props에 props를 전달할 수 있다.
//상태(state)를 가지지 못하여 상위 class 컴포넌트에서 상태를 props로 받아, 상위 state를 변경할 수 있다.
//{ }안에 App.js에서 받은 props 값, 메소드가 있다.
//구조분해화라고 하며 props 객체 안의 props(속성들)를 좀 더 쉽게 작성할 수 있다.
//매개변수를 props로 받을 경우, props객체의 속성을 props.속성이름 형식으로 써야 한다.
const Nav =({handleSearchInputChange,
handleSettingButtonClick,
user,
darkMode
}) => {
return (
//컴포넌트 태그만 작성되기 때문에 {}는 없어도 된다.
//하지만 console.log등을 사용하기 위해선 {}가 필요하기 때문에 작성하였다. {}를 쓸때는 return ()으로 작성해야 한다.
<nav className={darkMode ? "btn btn-dart" : btn btn-light}>
<div className="col-md-6 col-md-offset-3">
<Search
handleSearchInputChange={handleSearchInputChange}
darkMode={darkMode}
/>
</div>
<span>{user ? user.name : ""}님이 로그인했습니다.</span>
<button
className={darkMode? "btn btn-dark" : "btn btn-light"}
onClick={handleSettingButtonClick}
>setting
</button>
</nav>
)
};
//export name: name으로 특정한 모듈을 export한다.
//한 파일내 여러 변수, 클래스, 함수를 export할 수 있다.
//export default name: 파일 내에서 단 하나의 변수, 클래스 등을 export한다.
//var, let, const가 붙은 변수르 바로 default할 수는 없다(export default const Nav -> x)
export default Nav;
query(検索値)、youtube apiキー、および最大検索数(max)をoptionsオブジェクトに含め、searchYoutube(options,callback)メソッドを実行します.
//App.js
getYouTubeVideos(query){
let options ={
key: YOUTUBE_API_KEY,
query: query,
max: 2
}
serarchYoutube(options, videos =>{
//setStaet()로 상위 클래스의 state 상태를 변경할 수 있다.
this.setState({
videos: videos, //youtueAPI에서 받아온 비디오 정보 객체를 담은 배열
currentVideo: videos[0] //0번째 배열의 영상정보(재생가능)
})
);
}
ビデオの構造とサーバ呼び出し情報は、他の記事で説明します.
{handleSettingButtonClick}はAppです.これはjsからもらったhandleSettingButtonClick()の道具です.設定ボタンをクリックしてstateに入ります.isSettings Open値をfalse、trueに変更します.
//App.js
handleSettingButtonClick(){
this.setState(prevState => ({
isSettingOpen: !prevState.isSettingOpen
}));
}
NavでisSettings Openの状態を変更すると、左側からSettings構成部品が表示されなくなります.
//Setting.js
class Setting extends React.Component {
constructor(props){
super(props);
this.state ={
username: props.user ? props.user.name : ""
};
}
//Setting 관련 메소드
//render 내용을 설명하면서 작성할 것이다.
render() {
return (
//isOpen에 따라 className이 변경된다.
//"mdl show"이면 visibility: visible css로 화면에 나타나고,
//"mdl"이라면 visibility hidden, 위치값 모두 0, position: apsolute로 화면에 나타나는 모습이 없다.
<div className={this.props.isOpen ? "mdl show" : "mdl"}>
//handleClose는 App.js에서 handleSettingButtonClick()을 가지고 있다. isSettingOpen을 변경해준다.
//"mdl-mask"는 mdl show 하위 태그인데 css가 absolute로 전체 화면을 차지하고 있다(약간 어두운 색) 이 화면을 클릭 시 handleClose가 실행되는 것이다.
<div className="mdl-mask" onClick={this.props.handleClose}></div>
<div className="sidebar">
<h3>Setting</h3>
<hr />
<fieldset>
<legend>사용자 설정</legend>
<span className="small-margin-right">사용자 이름</span>
<input
type="text"
className="small-margin-right"
value={this.state.username}
//Setting에서 handleChangeName(event)를 실행시킨다
onChange={this.handleChangeName.bind(this)}
/>
<button onClick={this.handleSave.bind(this)}>저장</button>
</fieldset>
<hr />
<fieldset>
<legend>일반</legend>
<label>
<input
type="checkbox"
className="small-margin-right"
onChange={this.handleToggleDarkMode.bind(this)}
></input>
<span>Dark Mode</span>
</label>
</fieldset>
</div>
</div>
);
}
}
usernameはpropsを開始値とします.user.親アプリケーションとして名前で保存します.jsのprops user.名前を意味します.すなわち、開始値は「金符号化」である.
onChangeは、値を変更するたびに発生するイベントです.
handleChangeName(event){
this.setState({
//event는 이 메소드를 실행시킨 이벤트를 말한다. 여기서는 onChange가 된다.
//target은 event가 발생한 태그, value는 그 태그가 지닌 값이다.
username: event.target.value
});
}
App.jsのstateをpropsとするhandleUpdateSettings()を実行して設定します.jsのstate.アプリケーションのユーザー名.jsのstate.currentuser.name値を使用します.
//Setting.js
handleSave() {
//Setting이 받은 props는 App.js에서 넘어온 props이다.
//그러니 아래 메소드는 App.js의 handleUpdateSetting이 실행되는 것이다.
this.props.handleUpdateSetting("currentUser", {
name: this.state.username
});
}
//App.js
handleUpdateSetting(key, value) {
const pair = {};
pair[key] = value; //pair["currentUser"] = this.state.username(Setting.js의 username이다.)
this.setState(pair); //const pair ={currentUser: this.state.username(Setting.js) }
}
//Setting.js
handleToggleDarkMode(event) {
this.props.handleUpdateSetting("darkMode", event.target.checked);
}
//App.js
handleUpdateSetting(key, value){
const pair ={};
pair[key] = value;//pair["darkMode"] = event.target.checked(true or false);
this.setState(pair);// pair = {darkMode: true or false}
}
App.jsを含むすべてのコンポーネントタグのうち、className={this.state.darkMode?[a]:[b]}を持つタグのステータスはhandleUpdateSettingsに変更され、cssも変更されます.
Reference
この問題について(YouTube APIクライアントの使用(2)), 我々は、より多くの情報をここで見つけました https://velog.io/@unow30/youtube-api-사용하기-클라이언트2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol