Реагировать динамически создавать кнопки на основе количества результатов - PullRequest
0 голосов
/ 25 апреля 2018

Я работаю в приложении Spring, которое использует реагирует. В настоящее время у меня есть JSON, который содержит несколько пользователей на основе определенных критериев. Количество пользователей может варьироваться, но я бы хотел создать несколько кнопок для каждого возвращаемого пользователя, который ссылается на профиль пользователя. URL-адрес просто '/ profile / username'

формат JSON

[{"user":{"principal":"cat@sitter.com","schedule":null,"appointments":null,"roles":["ROLE_USER"],"attributes":{"principal":"cat@sitter.com","zipcode":"98077","firstname":"cat","password":"abc123","sitterFlag":"true","ownerFlag":"false","lastname":"sitter","username":"catsitter","preferredPet":"Cat"},"momento":"cat@sitter.com"},"password":"$2a$10$ltnL.mFqo7hatj69Ls76xeegjhEX0D4At9m1rlBHbQtDrV8MdSeAS","momento":"cat@sitter.com"},{"user":{"principal":"test@pets.com","schedule":null,"appointments":null,"roles":["ROLE_USER"],"attributes":{"principal":"test@pets.com","zipcode":"98077","firstname":"test","password":"abc123","sitterFlag":"false","ownerFlag":"false","lastname":"pets","username":"testpets"},"momento":"test@pets.com"},"password":"$2a$10$wDhS6Mb8syhC0YIqgVG2qu8J6lA.1T.UprMYwAX6O7Xb3YMhgX3bO","momento":"test@pets.com"},{"user":{"principal":"test@sitter.com","schedule":null,"appointments":null,"roles":["ROLE_USER"],"attributes":{"principal":"test@sitter.com","zipCode":"98077","firstname":"test","password":"abc123","lastname":"sitter","username":"testsitter"},"momento":"test@sitter.com"},"password":"$2a$10$DuIeWFSzhtAjX3lr8xBNiu2kV9kAJ/PQ6pB/EzkB7FkGWfRbwxkzy","momento":"test@sitter.com"},{"user":{"principal":"sit@sitter.com","schedule":null,"appointments":null,"roles":["ROLE_USER"],"attributes":{"principal":"sit@sitter.com","zipCode":"98077","firstname":"sit","password":"abc123","lastname":"sitter","username":"imasitter"},"momento":"sit@sitter.com"},"password":"$2a$10$2NKOQkGZO/jUer3UjNGzdugUhkMV1pJ1eT8NQjSPRto9/cRdm56sO","momento":"sit@sitter.com"},{"user":{"principal":"a@sitter.com","schedule":null,"appointments":null,"roles":["ROLE_USER"],"attributes":{"principal":"a@sitter.com","zipCode":"98077","firstname":"a","password":"abc123","lastname":"sitter","username":"asitter"},"momento":"a@sitter.com"},"password":"$2a$10$8x1uVqR28x5rwNrydieSyu1ILifBJ5n0dUsZI5tJ6MoUWMqXxrmeq","momento":"a@sitter.com"}]

У меня сейчас работает, если я жестко пишу код для каждого пользователя:

<div className="container padded">
    <div className="row">
        <div className="col-6 offset-md-3">
            <h2>Suggested Sitters</h2>
            <button onClick={() => this.suggestSitter(this.props.user.principal)}>Click</button>
            <hr/>
            <div>
                Sitters:
            </div>
            <Link to={this.setProfile(this.state.sitter ? this.state.sitter[1].user.attributes.username: ' ')} >
                <button type="button">{this.state.sitter ? this.state.sitter[1].user.attributes.username: ' '}</button>
            </Link>
        </div>
    </div>
</div>

setProfile работает так:

setProfile(theUser) {
    return '/profile/' + theUser;
}

Нажатие кнопки перенаправит на страницу профиля этого пользователя.

Таким образом, в основном, вместо жесткого кодирования n кнопок, я хотел бы динамически создавать n кнопок, и каждая из них будет ссылаться на '/ profile / username / для каждого возвращаемого пользователя.

предложить функцию Sitter:

suggestSitter(user){
        var _this = this;
        console.log('user', user);
        axios.get('/api/user/suggest_sitter', { params: { principal: user } })
            .then(function(response) {
                console.log('Response: ' + JSON.stringify(response));
                _this.setState({
                    sitter: response
                });
            })
            .catch(function (e) {
                console.log('Error: ' + e);
            });
    }

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

Предположим, ваши данные:

const data = [
  {user: {...}, attribute: {...}},
  {user: {...}, attribute: {...}},
  ...
]

Теперь вы можете выполнить следующие действия:

Создайте компонент без сохранения состояния / состояния (в зависимости от вашего варианта использования): UserButton или любое другое значимое имя:

const UserButton = () => (
    <div className="container padded">
        <div className="row">
            <div className="col-6 offset-md-3">
                /*...Add your remaining JSX....*/
            </div>
        </div>
    </div>
)

Теперь в вашем родительском компоненте (откуда вы на самом деле визуализируете данные) вы можете сделать следующее:

renderUserButtons = () => {
    return data.map((userData) => (
        <UserButton key="Some-unique-id-can-be-anything" PASS_YOUR_PROPS_HERE/>
    ))
}

render() {
    return (
        <div>
            ...
            {this.renderUserButtons()}
            ...
        </div>
    );
}

Очевидно, что для этого вам не нужно несколько компонентов, но разбиение его на более мелкие компоненты выглядит хорошо, проще в обслуживании и проще в тестировании. Опять же, это мое личное предпочтение. Вы можете использовать конвенцию так, как вам лучше.

0 голосов
/ 25 апреля 2018

Чтобы создать любой компонент пользовательского интерфейса из некоторого массива, вы всегда можете использовать функцию карты, как показано ниже.

Массив объекта JSON

let users = [{"name":"ABC"},{"name":"DEF"},{"name":"GHI"}];

Функция карты

let userList = users.map((user,index)=>{return (<div>{index} - {user.name}<div>)})

это даст вам следующий вывод:

0 - ABC 1 - DEF 2 - GHI

в функции карты user - это ссылка на одного пользователя из массива.Индекс - это ключ для каждого значения из массива (например, 0,1,2 ....).

Мы возвращаем объект JSX из оператора return.

Теперь вы можете использовать переменную userList при возврате рендера.Как показано ниже ..

render(){ let userList = "...."; return(<div>{userList}</div>

Надеюсь, это поможет.

0 голосов
/ 25 апреля 2018

Вы можете сопоставить данные с массивом Link (укажите для него также уникальный ключ):

{this.state.sitter.map((e) => (
  <Link key={e.someUniqueProperty} to={this.setProfile(e.user.attributes.username)}>
    <button type="button">{e.user.attributes.username}</button>
  </Link>
))}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...