react基础1(导入组件,绑定属性,引入图片,react双向绑定)注明:vue中使用ref调用时写法为this.$refs,而react中调用时为this.refs
1、组件的写法
组件的写法
1.import React from ‘react’;
2.声明当前组件的类
class Rindex extends React.Component{
}
3.暴露出去 export default name;
4.写类里面render 渲染方法
render(){
return (标签)
多个标签??? 单个标签
}
5.在组件里面声明constructor (构造函数)
super() 指继承父类里面相关属性和方法
6.声明数据
React 组件里面声明数据在构造函数 里面 的state属性里面去声明
7.数据的渲染 { es6里面的代码块 }
2.绑定属性
state中写入数据,在{}代码中引入
class Bute extends Component { constructor() { super(); this.state = { title: "绑定title属性", color: "fontcolor", w: 100, h: 100, marleft: 100, style: { width: "100px", height: "100px", marginLeft: "100px" } }; } render() { return ( <div> <span>属性操作组件</span> <div title={this.state.title}></div> {/* 特殊的属性 和js 代码冲突 class ----className */} <div className="fontcolor"> 修改颜色 </div> <div className={this.state.color}> 修改颜色 </div> {/* 由于 for 在 JavaScript 中是保留字,所以 React 元素中使用了 htmlFor 来代替。 lable标签中的for用于for 属性规定 label 与哪个表单元素绑定。 如果使用了for绑定了lable里边的内容,则它包裹元素的事件也会给lable加上,即为显式绑定,不使用for即为隐式绑定,仅仅作为一个包裹元素 */} <label htmlFor="lable">label</label> {/* 绑定元素的css样式 */} <div style={{ width: '100px', height: "100px", marginLeft: "100px" }}> 直接绑定元素的css </div> <div style={{ width: this.state.w + 'px', height: this.state.h + "px", marginLeft: this.state.marleft + "px" }}> 直接绑定元素的css </div> {/* 动态绑定元素的css样式 */} <div style={this.state.style}> 直接绑定元素的css </div> </div> ); } }
tips:
由于 for 在 JavaScript 中是保留字,所以 React 元素中使用了 htmlFor 来代替。 lable标签中的for用于for 属性规定 label 与哪个表单元素绑定。
如果使用了for绑定了lable里边的内容,则它包裹元素的事件也会给lable加上,即为显式绑定,不使用for即为隐式绑定,仅仅作为一个包裹元素
3、引入图片的方法
第一种:
先导入:import img from ‘…/assets/image/1.jpg’
再使用(直接使用):< img src={img} alt="" />
第二种:
直接使用 require 请求,require(“这里写图片路径”)
<img src={require("…/assets/image/timg.jpg")} alt="" />
一个引用数据的小案例:
class ImageArray extends Component { constructor(props) { super(props); this.state = { msg: [1, 2, 3, 4], ele: [<span>1</span>, <span>2</span>, <span>3</span>, <span>4</span>], stus: [ { name: "张三", age: 18, hobby: [ { name: "篮球" }, { name: "乒乓球" }, { name: "棒球" }, { name: "羽毛球" } ] }, { name: "李四", age: 18, hobby: [ { name: "篮球" }, { name: "乒乓球" }, { name: "棒球" }, { name: "羽毛球" } ] } ] }; } render() { return ( <div> {/* 图片的引入和数据循环 */} <img src={img} alt="" /> <img src={require("../assets/image/timg.jpg")} alt="" /> <ul> { this.state.msg.map((val, key) => { return ( <li key={key}>{val}</li> ) }) } { this.state.ele.map((val, key) => { return ( <li key={key}> {val} </li> ) }) } { this.state.stus.map((val, key) => { return ( <li key={key}> <span>{val.name}</span> <span>{val.age}</span> <ul> { val.hobby.map((v, k) => { return ( <li key={k}>{v.name}</li> ) }) } </ul> </li> ) }) } </ul> </div> ); } }
案例效果图:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
- 张三18
篮球
乒乓球
棒球
羽毛球 - 李四18
篮球
乒乓球
棒球
羽毛球
react不同与vue,没有V-model,只能手动实现双向绑定,以下为实现方法
事件绑定的三种方式:
**1、在引用方法时加上bind(this),可以获取到this.setState()的,否则即为undefined
点击事件
2、在构造函数里面传递this,也就是在构造函数中加入
this.getData = this.getData.bind(this);
3、使用ES6的箭头函数保持this指针前后指向一致;
getInfo = () => {
console.log(this.state.msg);
}
通过setstate()方法更新数据:
使用API setState 记住:state 是只读,只能使用API更新数据
updateData = () => { this.setState({ msg: "我是修改之后的" }); }
传递参数:在方法的末尾,写入参数到bind函数,从而传递数据,在这里要注意,bind里的第一个参数必须为this,写入其他参数的话,第一个参数会被this覆盖。
方法:
sendData = (x, y, z) => { console.log(x, y, z); }
dom:
{/* 执行事件 传参 */} <button onClick={this.sendData.bind(this, 1, 2, 3)}>传递参数</button>
获取事件执行对象的两种方法:
1、e.target:注意:由于引用方法时后缀有bind(this,1);所以这里getEvent的第一个参数就是bind中传入的1,所以引入event时要靠后一位。
getEvent = (e, event) => { let ele=event.target console.log(ele.getAttribute("data-index")); //原生js 写的事件执行对象也可以用 // let ev = window.event; // console.log(ev.target); }
dom:
{/* 执行事件参数*/} <button onClick={this.getEvent.bind(this, 1)} data-index="1">获取事件的参数</button>
2、使用ref获取dom元素(注明:vue中使用ref调用时写法为this.$refs,而react中调用时为this.refs)
方法:
getDom=()=>{ //this.refs console.log(this.refs.block.innerHTML); }
调用:
{/* react 中获取dom元素 ref */} <button onClick={this.getDom}>点击获取dom元素</button> <div ref="block">我是带有ref属性的元素</div>
react实现数据双向绑定的方法:
以输入文本框为例,在这里写了两个方法:
//表单元素的操作 getInput(){ //console.log(this.refs.name.value); console.log(this.state.text); } //手动实现 数据双向绑定 changeData(e){ let val=e.target.value; this.setState({ text:val //这里绑定onchange事件,调用state的API,setstate,处理了实时更新后台数据的功能 }); }
dom:
{/*表单事件 元素的值问题 */} <input type="text" ref="name" value={this.state.text} onChange={this.changeData.bind(this)}/> <button onClick={this.getInput.bind(this)}>获取input的值</button>
以下附上源码:
import React, { Component } from 'react'; class Event extends Component { constructor(props) { super(props); this.state = { msg: "点击输出msg", text:"我是文本框的值" }; //绑定this 替换 this.getData = this.getData.bind(this); } //1.事件绑定执行的方法 getMsg() { console.log("执行方法"); //在该方法里面去调用当前组件的相关东西 console.log(this.state.msg); } //2. 在构造函数里面传递this getData() { console.log("执行方法"); console.log(this.state.msg); } //3.事件的第三种绑定方式 getInfo = () => { console.log(this.state.msg); } //修改数据 updateData = () => { //使用API setState 记住:state 是只读 this.setState({ msg: "我是修改之后的" }); } //传递参数 sendData = (x, y, z) => { console.log(x, y, z); }// 事件的执行对象 getEvent = (e, event) => { /* let ele=event.target console.log(ele.getAttribute("data-index")); */ //原生js 写的事件执行对象也可以用 let ev = window.event; console.log(ev.target); } //获取dom元素 getDom=()=>{ //this.refs console.log(this.refs.block.innerHTML); } //表单元素的操作 getInput(){ //console.log(this.refs.name.value); console.log(this.state.text); } //手动实现 数据双向绑定 changeData(e){ let val=e.target.value; this.setState({ text:val }); } render() { return ( <div> <span>React 的 事件</span><br></br> {/* 事件的方法直接去类里面声明 */} <button onClick={this.getMsg.bind(this)}>点击事件</button> {/* 事件的第二种写法 在构造函数里面传递this */} <button onClick={this.getData}>点击事件</button> {/* 事件的第三种 直接使用es6 */} <button onClick={this.getInfo}>点击事件</button> {/* react修改数据 */} <button onClick={this.updateData}>修改数据</button> {/* 执行事件 传参 */} <button onClick={this.sendData.bind(this, 1, 2, 3)}>传递参数</button> {/* 执行事件参数*/} <button onClick={this.getEvent.bind(this, 1)} data-index="1">获取事件的参数</button> {/* react 中获取dom元素 ref */} <button onClick={this.getDom}>点击获取dom元素</button> <div ref="block">我是带有ref属性的元素</div> {/*表单事件 元素的值问题 */} <input type="text" ref="name" value={this.state.text} onChange={this.changeData.bind(this)}/> <button onClick={this.getInput.bind(this)}>获取input的值</button></div> ); } } export default Event;
- Vue基础精讲 —— Vue的组件之组件的定义、继承、自定义双向绑定、高级属性
- angular,vue,react的基本语法—动态属性、事件绑定、ref,angular组件创建方式
- 【VUE】使用Table组件进行数据双向绑定
- 问题杂记-Vue组件中使用地址引入图片
- vue 使用ref 让父组件调用子组件的方法
- vue组件中使用别名@引入图片 :html css js
- Undefined is not an Object(evaluating this.props.n使用react-navigation再引入的组件中做导航跳转
- React 第三天学习(react中添加样式,css样式作用域的问题,React 中 绑定事件,双向绑定事件,React组件的生命周期,在 React项目中 使用 bootsrtap)
- Vue学习1-1.基础语法;2.指令:表单输入绑定,文本渲染;3.组件:定义组件,使用组件
- react 纯函数组件中使用ref属性方法
- vue 自定义组件 v-model双向绑定、 父子组件同步通信的多种写法
- vue2.3.0+使用.sync修饰符对prop进行双向绑定/子组件同步prop到父组件绑定的值
- vue 使用ref 让父组件调用子组件的方法
- vue.js--基础 v-bind绑定属性使用
- Vue.js父与子组件之间传参 父向子组件传参 例子:App.vue为父,引入componetA组件之后,则可以在template中使用标签(注意驼峰写法要改成componet-a写法,因为ht
- vue.js组件之间通讯的数据双向绑定----父亲把数据传递给儿子,儿子更改数据后,重新发送给父亲,父亲数据更改后,属性会重新发送个儿子,儿子刷新新数据
- 安卓Service组件使用系列4:绑定service并调用service中的方法返回结果
- react中,组件的交互及this.state属性
- 初识ReactJS的组件化开发(二):组件嵌套和属性的基本使用
- vue组件 $children,$refs,$parent的使用详解