react基础学习笔记----react的简单使用,react三大核心属性-state-props-refs-收集表单数据。代码案例

helloReact案例

<body>
    <!-- 准备好一个容器 -->
    <div id="test"></div>

    // 引入react的三个包
    <script src="../js/react.development.js"></script>
    <script src="../js/react-dom.development.js"></script>
    <script src="../js/babel.min.js"></script>
    // 解析jsx一定要用bable
    <script type="text/babel">
        //1.创建虚拟dom
        // <!-- 此处不能写引号 -->
        const VDOM = <h1>hello,React</h1> 

        //2.渲染虚拟Dom到页面
        ReactDOM.render(VDOM,document.getElementById("test"))

    </script>
</body>

两种创建虚拟DOM的方法

//js方法
<body>
    <!-- 准备好一个容器 -->
    <div id="test"></div>
    <script src="../js/react.development.js"></script>
    <script src="../js/react-dom.development.js"></script>
    <script >
        //1.创建虚拟dom
        // const VDOM = React.createElement(标签名,标签属性,标签内容)
        const VDOM = React.createElement('h1',{id:'title'},React.createElement('span',{},"hello,React"))
        //2.渲染虚拟Dom到页面
        ReactDOM.render(VDOM,document.getElementById("test"))

    </script>
</body>
//jsx写法
<body>
    <!-- 准备好一个容器 -->
    <div id="test"></div>
    <script src="../js/react.development.js"></script>
    <script src="../js/react-dom.development.js"></script>
    <script src="../js/babel.min.js"></script>
    <script type="text/babel">
        //1.创建虚拟dom
        // <!-- 此处不能写引号 -->
        const VDOM = (
            <h1 id="title">
                <span>hello,React</span>
            </h1> 
        )
        //2.渲染虚拟Dom到页面
        ReactDOM.render(VDOM,document.getElementById("test"))

    </script>
</body>

对比:jsx创建更加的简单

虚拟DOM与真实DOM

<script type="text/babel">
        //1.创建虚拟dom
        // <!-- 此处不能写引号 -->
        const VDOM = (
            <h1 id="title">
                <span>hello,React</span>
            </h1> 
        )
        //2.渲染虚拟Dom到页面
        ReactDOM.render(VDOM,document.getElementById("test"))
        console.log("虚拟DOM",VDOM);
        const TDOM =document.getElementById("test");
        console.log("真实DOM",TDOM); 
        /* 
            关于虚拟DOM:
                1.本质是Object类型的对象(一般对象)
                2.虚拟DOM比较轻,真实DOM比较重,因为虚拟DOM是React内部在用,无需真实DOM那么多的属性
                3.虚拟DOM最终会被转化为真实DOM,呈现在页面上
        */
</script>

JSX语法

  • 全称: JavaScript XMLs
  • react定义的一种类似于XML的S扩展语法:JS+ XML
  • 本质是React.createElernent(component, props…children)方法的语法糖e4作用:用来简化创建虚拟 DOM -
    • 写法: var ele = ch1>Hello sx!e-
    • 注意1:它不是字符串,也不是 HTMLFXML标签ec.注盒2:它最终产生的就是一个JS对象e
  • 标签名任意: HTML标签或其它标签v
<script type="text/babel">
        const myID = "Spark"
        const myData = "hello,React!"
        // 创建虚拟DOM
        const VDOM = (
            <div>
                <h2 className="title" id={myID}>
                    <span style={{fontSize: 20+"px"}}>{myData}</span>
                </h2>
                <h2 className="title" id={myID.toLocaleUpperCase}>
                    <span style={{fontSize: 20+"px"}}>{myData}</span>
                </h2>
                <input type="text"></input>
                <good>asdasd</good>
            </div>
        )
        ReactDOM.render(VDOM,document.getElementById("test"))
        /* 
            jsx语法规则
                1.定义虚拟DOM时,不要写引号
                2.标签中混入js表达式时候要中{}
                3.样式的类名指定,不要用class,要用className
                4.内联样式,要用style={{key:value}}的形式去写
                5.只有一个根标签
                6.标签要闭合
                7.标签首字母
                    (1)。若小字母开头,则将该标签转为html中同名元素,若html中无该标签对应的同名元素,则报错
                    (2).若大写字母开头,react就去渲染对应的组件,若组件没有定义
        */
    </script>

JSX小练习

 <script type="text/babel">
        const data = [
            { id:1,name:'vue'},
            {id:2,name:'react'},
            {id:3,name:'angular'}

        ]
        const VDOM = (
            <div>
                <h1>前端js框架列表</h1>
                <ul>
                    {
                        data.map((item) =>{
                            return <li key={item.id}>{item.name}</li>
                        })
                    }
                </ul>
            </div>
            
        )

        ReactDOM.render(VDOM,document.getElementById("test"))
    </script>

总结React中数据动态绑定和遍历


const title = '前端js框架列表'

const VDOM = (
            <div>
                // 数据绑定
                <h1>{title}</h1>
                // 类名绑定
                <h1 className='test'>{title}</h1>
                //属性绑定
                <span style={{fontSize: 20+"px"}}><span>
                <ul>
                    {
                        // 遍历数据使用map
                        data.map((item) =>{
                            return <li key={item.id}>{item.name}</li>
                        })
                    }
                </ul>
            </div>
            
        )

React 面向组件编程

函数式组件

 <script type="text/babel">
        // 1.创建函数式组件
        function MyComponent() {
            console.log(this); //这里的this值为undefind 因为babel开启了严格模式
            return <h2>我是函数定义的简单组件</h2>
        }
        // 2.渲染组件到页面
        ReactDOM.render(<MyComponent />, document.getElementById("test"))
        /* 
            执行了ReactDOM.render(<MyComponent />, ....之后发生了什么)
            1.React解析组件标签,找到MyCompoent组件
            2.发现组件是使用函数定义的,随后调用该函数,将返回的虚拟DOM转为真实DOM,随后呈现在页面中
        */
    </script>

类式组件

<script type="text/babel">
        //1.创建类式组件
        class MyComponent extends React.Component {
            render() {
                // render是放在类的原型对象上,供实例使用
                // 这里的this是MyCompoent的实例对象
                console.log(this);
                return  <h2>我是用类定义的组件,适用于复杂组件</h2>
                
            }
        }
        //2.渲染组件到页面
        ReactDOM.render(<MyComponent></MyComponent>,document.getElementById("test"))
        /* 
            执行了ReactDOM.render(<MyComponent />, ....之后发生了什么)
            1.React解析组件标签,找到MyCompoent组件
            2.发现组件是使用类定义的,随后new出来该类的实例,并通过该实例,调用到原型上的render方法
            3.将render返回的虚拟DOM转为真实DOM,随后呈现在页面上
        */
    </script>

组件的三大核心属性

state

完整写法

    <script type="text/babel">
        //创建组件
        class Weather extends React.Component {
            //构造器调用了几次-----一次
            constructor(props) {
                super(props);
                // 初始化状态
                this.state = {isHost:false,wind:'微风'}
                // 改变changWeather的this指向,解决方法中this指向问题
                this.changeWeather = this.changeWeather.bind(this)
            }
            // render调用了几次  1+n次
            render() {
                const {isHost,wind} = this.state;
                // 给h1标题绑定一个事件,改变isHost的值
                return <h1 onClick={this.changeWeather}>今天天气很{isHost?"热":'凉'},{wind}</h1>
            }
            // changeWeather调用几次  点几次调用几次
            changeWeather(){
                //changeWeather在类的原型对象上
                // 由于changeWeather是作为onClick的回调,所以不是通过实例调用的,是直接调用
                // 类中的方法默认开启了局部的严格模式,所以changeWeather中的this为undefined

                //获取与拿来isHost的值
                const isHost =this.state.isHost;
                // 状态不能直接更改,要借助内置的API
                // 状态必须通过setState进行更新,且更新是一种合并,不是直接替换
                this.setState({isHost:!isHost});
            }
        }
        ReactDOM.render(<Weather></Weather>,document.getElementById("test"))
    </script>

简写版本

    <script type="text/babel">
        //创建组件
        class Weather extends React.Component {
            //初始化状态
            state = {isHost:false,wind:'微风'}
            render() {
                const {isHost,wind} = this.state;
                return <h1 onClick={this.changeWeather}>今天天气很{isHost?"热":'凉'},{wind}</h1>
            }
            //自定义方法--要用赋值语句的形式+箭头函数
            changeWeather = ()=>{
                const isHost =this.state.isHost;
                this.setState({isHost:!isHost});
            }
        }
        ReactDOM.render(<Weather></Weather>,document.getElementById("test"))
    </script>

总结
组件中render方法中的 this为组件实例对象-
组件自定义的方法中 this为undefined,如何解决?
强制绑定this:通过函数对象的 bind()
箭头函数
状态数据,不能直接修改或更新

props

完整写法

    <script type="text/babel">
        //创建组件
        class Person extends React.Component{
            render(){
                //props是只读的
                const {name,age,sex} = this.props;
                return (
                    <ul>
                        <li>姓名: {name}</li>
                        <li>性别: {sex}</li>
                        <li>年龄: {age+1}</li>
                    </ul>
                )
            }
        }
        // 对标签属性进行类型必要性的限制
        Person.propTypes = {
            name: PropTypes.string.isRequired, //限制name为字符串,且必传
            sex: PropTypes.string, //限制sex为字符串
            age: PropTypes.number, //限制age为number
            speak: PropTypes.func //限制speak为函数
        }
        //指定默认标签属性值
        Person.defaultProps ={
            sex:'saas',
            age:20
        }
        const p = {name:'张三',age:18,sex:"男"}
        // ReactDOM.render(< Person name = "tom" age = "18" sex = "male" />, document.getElementById("test"))
        ReactDOM.render(< Person {...p} speak = {speak}/>, document.getElementById("test"))
        function speak(){
            console.log("adsadas");
        }
    </script>

简写方式

<script type="text/babel">
        //创建组件
        class Person extends React.Component{
            // 对标签属性进行类型必要性的限制
            static propTypes = {
                name: PropTypes.string.isRequired, //限制name为字符串,且必传
                sex: PropTypes.string, //限制sex为字符串
                age: PropTypes.number, //限制age为number
                speak: PropTypes.func //限制speak为函数
            }
            //指定默认标签属性值
            static defaultProps ={
                sex:'saas',
                age:20
            }
            render(){
                const {name,age,sex} = this.props;
                return (
                    <ul>
                        <li>姓名: {name}</li>
                        <li>性别: {sex}</li>
                        <li>年龄: {age+1}</li>
                    </ul>
                )
            }
        }
        const p = {name:'张三',age:18,sex:"男"}
        // ReactDOM.render(< Person name = "tom" age = "18" sex = "male" />, document.getElementById("test"))
        ReactDOM.render(< Person {...p} speak = {speak}/>, document.getElementById("test"))
        function speak(){
            console.log("adsadas");
        }
    </script>

函数式写法

    <script type="text/babel">
        //创建组件
        function Person(props){
            const {name,age,sex} = props;
            return (
                <ul>
                    <li>姓名: {name}</li>
                    <li>性别: {sex}</li>
                    <li>年龄: {age+1}</li>
                </ul>
            )
        }
        // 对标签属性进行类型必要性的限制
        Person.propTypes = {
            name: PropTypes.string.isRequired, //限制name为字符串,且必传
            sex: PropTypes.string, //限制sex为字符串
            age: PropTypes.number, //限制age为number
            speak: PropTypes.func //限制speak为函数
        }
        //指定默认标签属性值
        Person.defaultProps ={
            sex:'男',
            age:20
        }
        const p = {name:'张三',age:18,sex:"男"}
        ReactDOM.render(< Person {...p}/>, document.getElementById("test"))
    </script>

refs

字符串形式写法

问题:效率不高,不推荐使用

    <script type="text/babel">
        class Demo extends React.Component {
            render() {
                return (
                    <div>
                       <input ref="input1" type="text" placeholder="点击按钮提示数据"></input>
                       <button ref="button1" onClick={this.showData}>点我提示闭合</button>
                       <input onBlur={this.showData2} ref="input2"  placeholder="失去焦点提示"/> 
                    </div>
                )
            }
            showData = ()=> {
                console.log(this.refs.input1.value);
            }
            showData2 = ()=> {
                console.log(this.refs.input2.value);
            }
        }
        ReactDOM.render(<Demo></Demo>,document.getElementById("test"))

    </script>

回调形式的ref

<script type="text/babel">
        class Demo extends React.Component {
            render() {
                return (
                    <div>
                       <input ref={c =>this.input1= c} type="text" placeholder="点击按钮提示数据"></input>
                       <button ref={c=>this.button1 =c} onClick={this.showData}>点我提示闭合</button>
                       <input onBlur={this.showData2} ref={c =>this.input2 = c}  placeholder="失去焦点提示"/> 
                    </div>
                )
            }
            showData = ()=> {
                console.log(this.input1.value);
            }
            showData2 = ()=> {
                // console.log(this.input2);
            }
        }
        ReactDOM.render(<Demo></Demo>,document.getElementById("test"))

    </script>

createRef

<script type="text/babel">
        class Demo extends React.Component {
            //React.createRef调用后可以返回一个容器,该容器可以储存被ref标识的节点,该容器是专人专用的
            myRef = React.createRef();
            myRef1 = React.createRef();

            render() {
                return (
                    <div>
                       <input ref={this.myRef} type="text" placeholder="点击按钮提示数据"></input>
                       <button  onClick={this.showData}>点我提示闭合</button>
                       <input onBlur={this.showData1} ref={this.myRef1} type="text" placeholder="点击按钮提示数据"></input>
                    </div>
                )
            }
            showData = ()=> {
                console.log(this.myRef.current.value);
            }
            showData1 = ()=>{
                console.log(this.myRef1.current.value);
            }
        }
        ReactDOM.render(<Demo></Demo>,document.getElementById("test"))

    </script>

事件处理

<script type="text/babel">
        class Demo extends React.Component {
            /* 
                1.通过onXXX属性指定事件处理函数,注意大小写
                    a.React使用的是自定义(合成)事件,而不是使用的原生的DOM事件
                    b.React中的事件是通过事件委托的方式处理的(委托给组件最外层的元素)
                2.通过event.target得到发生事件的DOM元素对象----不要过度使用Ref
            */
            // 创建Ref容器
            myRef = React.createRef();
            myRef1 = React.createRef();
            render() {
                return (
                    <div>
                       <input ref={this.myRef} type="text" placeholder="点击按钮提示数据"></input>
                       <button  onClick={this.showData}>点我提示闭合</button>
                       <input onBlur={this.showData1} ref={this.myRef1} type="text" placeholder="点击按钮提示数据"></input>
                    </div>
                )
            }
            showData = ()=> {
                console.log(this.myRef.current.value);
            }
            showData1 = (event)=>{
                // console.log(this.myRef1.current.value);
                console.log(event.target.value);
            }
        }
        ReactDOM.render(<Demo></Demo>,document.getElementById("test"))

    </script>

react中收集表单数据

非受控组件

    <script type="text/babel">
        //创建组件
        class Login extends React.Component {
            render(){
                return (
                    <form onSubmit={this.handleSubmit}>
                        用户名:<input type="text" ref={c=>this.username = c} name="username" />
                        密码:<input type="password" ref = {c=>this.password = c} name="password"/>
                        <button>登录</button>
                    </form>
                )
            }
            handleSubmit = (event)=>{
                event.preventDefault() //阻止表单提交
                const {username,password} = this
                console.log(username.value,password.value);
            }
        }

        ReactDOM.render(<Login></Login>,document.getElementById("test"))
    </script>

受控组件

<script type="text/babel">
        //创建组件
        class Login extends React.Component {
            // 初始化状态
            state = {
                username: "",//用户名
                password: ""//密码
            }
            render(){
                return (
                    <form onSubmit={this.handleSubmit}>
                        用户名:<input type="text" onChange={this.saveUsername} name="username" />
                        密码:<input type="password" onChange= {this.savePassword} name="password"/>
                        <button>登录</button>
                    </form>
                )
            }
            handleSubmit = (event)=>{
                event.preventDefault() //阻止表单提交
                const {username,password} = this.state
                console.log(username,password);
            }
             //保存用户名到状态中
             saveUsername = (event)=>{
                 this.setState({username:event.target.value})
             }
            //保存密码到状态中
            savePassword = (event)=>{
                this.setState({password:event.target.value})
            }
        }
        ReactDOM.render(<Login></Login>,document.getElementById("test"))
    </script>

高阶函数与柯里化

<script type="text/babel">
        //创建组件
        class Login extends React.Component {
            /* 
                高阶函数:如果一个函数符合下面2个规范中的任何一个,那么这个函数就是高阶函数
                    1.若A函数,接收参数是一个函数,那么A就可以称之为高阶函数
                    2.若A函数,调用的返回值依然是一个函数,那么A就可以称之为高阶函数
                    常见的高阶函数有:Promise setTimeout 数组常用的方法
                函数的柯里化:通过函数调用继续返回函数的方式,实现多次接收参数最后统一处理的函数编码形式
            
            */
            render(){
                return (
                    <form onSubmit={this.handleSubmit}>
                        用户名:<input type="text" onChange={this.saveFormData('username')} name="username" />
                        密码:<input type="password" onChange= {this.saveFormData('password')} name="password"/>
                        <button>登录</button>
                    </form>
                )
            }
            // 初始化状态
            state = {
                username: "",//用户名
                password: ""//密码
            }
            handleSubmit = (event)=>{
                event.preventDefault() //阻止表单提交
                const {username,password} = this.state
                console.log(username,password);
            }
            // 保存表单数据到状态中
            saveFormData = (dataType)=>{
                return (event)=>{
                    this.setState({[dataType]:event.target.value});
                }
            }
        }
        ReactDOM.render(<Login></Login>,document.getElementById("test"))
    </script>

不用柯里化实现

<script type="text/babel">
        //创建组件
        class Login extends React.Component {
            /* 
                高阶函数:如果一个函数符合下面2个规范中的任何一个,那么这个函数就是高阶函数
                    1.若A函数,接收参数是一个函数,那么A就可以称之为高阶函数
                    2.若A函数,调用的返回值依然是一个函数,那么A就可以称之为高阶函数
                    常见的高阶函数有:Promise setTimeout 数组常用的方法
                函数的柯里化:通过函数调用继续返回函数的方式,实现多次接收参数最后统一处理的函数编码形式
            
            */
            render(){
                return (
                    <form onSubmit={this.handleSubmit}>
                        用户名:<input type="text" onChange={event=>this.saveFormData('username',event)} name="username" />
                        密码:<input type="password" onChange= {event=>this.saveFormData('pass',event)} name="password"/>
                        <button>登录</button>
                    </form>
                )
            }
            // 初始化状态
            state = {
                username: "",//用户名
                password: ""//密码
            }
            handleSubmit = (event)=>{
                event.preventDefault() //阻止表单提交
                const {username,password} = this.state
                console.log(username,password);
            }
            // 保存表单数据到状态中
            saveFormData = (dataType,event)=>{
                this.setState({[dataType]:event.target.value});
            }
        }
        ReactDOM.render(<Login></Login>,document.getElementById("test"))
    </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要为 ag-grid-react 自定义单元格编辑器创建带搜索和输入的输入框,你可以按照以下步骤进行操作: 1. 创建一个新的 React 组件,该组件将作为自定义单元格编辑器。 2. 在该组件的 render() 方法中,使用一个文本输入框和一个搜索输入框来创建你的输入框。 3. 在 componentDidMount() 方法中,使用 ag-grid-react 的 ICellEditorParams 接口中的方法获取单元格的当前值。 4. 在 ag-grid-react 的 ICellEditorParams 接口中实现 getValue() 方法,该方法将返回输入框的当前值。 5. 在 ag-grid-react 的 ICellEditorParams 接口中实现 isPopup() 方法,该方法将返回 true,以便输入框显示为弹出式窗口。 6. 在 ag-grid-react使用你的新自定义单元格编辑器。 以下是一个示例代码,演示如何创建一个带搜索和输入的输入框作为 ag-grid-react 自定义单元格编辑器: ```javascript import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { AgEditorCellDef } from 'ag-grid-react'; class SearchInputEditor extends Component { constructor(props) { super(props); this.state = { value: props.value, }; } componentDidMount() { this.refs.input.focus(); } getValue() { return this.state.value; } isPopup() { return true; } handleChange = (event) => { this.setState({ value: event.target.value }); } handleKeyDown = (event) => { if (event.keyCode === 13) { this.props.stopEditing(); } } render() { return ( <div> <input ref="input" type="text" value={this.state.value} onChange={this.handleChange} onKeyDown={this.handleKeyDown} /> <input type="text" placeholder="Search..." /> </div> ); } } SearchInputEditor.propTypes = { value: PropTypes.string, stopEditing: PropTypes.func.isRequired, }; export default class GridExample extends Component { constructor(props) { super(props); this.state = { columnDefs: [ { headerName: 'Name', field: 'name', editable: true, cellEditorFramework: SearchInputEditor, }, { headerName: 'Age', field: 'age', editable: true, }, { headerName: 'Gender', field: 'gender', editable: true, }, ], rowData: [ { name: 'John Smith', age: 35, gender: 'Male' }, { name: 'Jane Doe', age: 28, gender: 'Female' }, { name: 'Bob Johnson', age: 42, gender: 'Male' }, ], }; } render() { return ( <div className="ag-theme-balham" style={{ height: '500px', width: '600px' }} > <AgGridReact columnDefs={this.state.columnDefs} rowData={this.state.rowData} enableSorting={true} /> </div> ); } } ``` ### 回答2: ag-grid-react允许我们自定义单元格编辑器,以满足特定的需求。要创建一个带搜索和输入框的自定义单元格编辑器,我们可以按照以下步骤进行: 1. 首先,我们需要创建一个React组件作为单元格编辑器。我们可以使用antd或其他UI库中的输入框组件,该组件已经带有搜索功能。在该组件内部,我们可以添加输入框和搜索按钮。 2. 在自定义编辑器组件中,我们需要实现ag-Grid的IAgEditorReact接口,以便它可以与ag-Grid进行交互。我们必须实现接口中的相关方法,如getValue()、isPopup()、isCancelBeforeStart()等。 3. 实现getValue()方法时,我们可以在函数内部获取输入框的值并返回它。这样,编辑器就可以将输入框的值传回给ag-Grid。 4. 其他方法如isPopup()和isCancelBeforeStart()可以根据需求进行实现,以控制编辑器的弹出和取消行为。 5. 在创建自定义单元格时,我们需要指定单元格的编辑器。我们可以设置editType为"custom",并将我们之前创建的自定义编辑器组件作为cellEditor设置。这将使ag-Grid在需要编辑单元格时使用我们的自定义编辑器。 这样,我们就可以利用自定义单元格编辑器为ag-grid-react创建一个带有搜索功能的输入框了。每次需要编辑单元格时,ag-Grid将显示我们定义的自定义编辑器组件,并且我们可以在自定义编辑器组件中自由定义输入框的样式和功能。 ### 回答3: ag-grid-react是一个用于创建数据网格的React组件库。它允许我们自定义单元格编辑器,以便满足特定的需求。对于要求带搜索功能的输入框,我们可以创建一个自定义的单元格编辑器组件。 首先,我们可以创建一个名为SearchInput的React组件,该组件包含一个带搜索功能的输入框。在这个组件中,我们可以使用合适的逻辑和UI库来实现搜索功能,例如在输入框中实时过滤并显示匹配的结果。 接下来,我们可以创建一个名为CustomCellEditor的React组件,并在其中使用SearchInput组件作为单元格编辑器。在CustomCellEditor组件中,我们需要实现ag-grid-react提供的ICellEditor接口,并重写相关方法。 在getGui方法中,我们返回SearchInput组件作为单元格编辑器的UI。在getValue方法中,我们可以获取SearchInput组件中输入框的值并返回。在isPopup方法中,我们可以定义是否显示这个单元格编辑器的弹出框。 最后,我们可以将CustomCellEditor组件应用到我们的数据网格中的特定列。在ag-grid-react配置中的columnDefs中,我们可以为需要使用自定义单元格编辑器的列设置cellEditor属性为CustomCellEditor组件。 通过以上步骤,我们可以创建一个带有搜索功能的输入框作为ag-grid-react的自定义单元格编辑器。这样,在网格中的相关列中,当用户需要编辑单元格时,就会显示这个带搜索的输入框。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值